This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new 2477610  EMPIREDB-315 Extends Options to allow entries being 
active/inactive
2477610 is described below

commit 2477610325277916752c74a6f76c3d09297b8f24
Author: Rainer Döbele <[email protected]>
AuthorDate: Thu Oct 31 13:10:18 2019 +0100

    EMPIREDB-315
    Extends Options to allow entries being active/inactive
---
 .../apache/empire/jsf2/components/SelectTag.java   | 148 +++++++++++++++-
 .../apache/empire/jsf2/controls/InputControl.java  |   9 +-
 .../empire/jsf2/controls/RadioInputControl.java    |   4 +-
 .../empire/jsf2/controls/SelectInputControl.java   | 197 ++++++++-------------
 .../jsf2/pageelements/BeanListPageElement.java     |   2 -
 .../org/apache/empire/commons/OptionEntry.java     |  21 ++-
 .../java/org/apache/empire/commons/Options.java    |  61 +++++--
 .../org/apache/empire/commons/OptionsTest.java     |   2 +-
 8 files changed, 289 insertions(+), 155 deletions(-)

diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java
index cdd593b..36929ed 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java
@@ -19,8 +19,10 @@
 package org.apache.empire.jsf2.components;
 
 import java.io.IOException;
+import java.util.Locale;
 import java.util.Map;
 
+import javax.el.ValueExpression;
 import javax.faces.component.NamingContainer;
 import javax.faces.component.UIInput;
 import javax.faces.component.html.HtmlSelectOneMenu;
@@ -31,11 +33,14 @@ import javax.faces.context.FacesContext;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.Options;
 import org.apache.empire.commons.StringUtils;
+import org.apache.empire.data.Column;
 import org.apache.empire.exceptions.InvalidPropertyException;
+import org.apache.empire.exceptions.NotSupportedException;
 import org.apache.empire.jsf2.app.FacesUtils;
 import org.apache.empire.jsf2.app.TextResolver;
 import org.apache.empire.jsf2.controls.InputAttachedObjectsHandler;
 import org.apache.empire.jsf2.controls.InputControl;
+import org.apache.empire.jsf2.controls.InputControl.InputInfo;
 import org.apache.empire.jsf2.controls.InputControlManager;
 import org.apache.empire.jsf2.controls.SelectInputControl;
 import org.apache.empire.jsf2.utils.TagEncodingHelper;
@@ -51,6 +56,141 @@ public class SelectTag extends UIInput implements 
NamingContainer
 
     protected SelectInputControl control = null;
     
+    private class SelectInputInfo implements InputInfo
+    {
+        @Override
+        public Column getColumn()
+        {
+            return null;
+        }
+
+        @Override
+        public Options getOptions()
+        {
+            return SelectTag.this.getOptionList();
+        }
+
+        @Override
+        public Object getValue(boolean evalExpression)
+        {
+            Object value = SelectTag.this.getValue();
+            if (value != null)
+            {
+                if (value.getClass().isEnum())
+                    value = ((Enum<?>) value).name();
+                else
+                    value = String.valueOf(value);
+            }
+            return value;
+        }
+
+        @Override
+        public String getFormat()
+        {
+            String nullText = SelectTag.this.getNullText();
+            if (StringUtils.isEmpty(nullText))
+                return null;
+            // return format for null text
+            return InputControl.FORMAT_NULL+nullText;
+        }
+
+        @Override
+        public Locale getLocale()
+        {
+            return null;
+        }
+
+        @Override
+        public String getText(String key)
+        {
+            return null;
+        }
+
+        @Override
+        public TextResolver getTextResolver()
+        {
+            return  
FacesUtils.getTextResolver(FacesContext.getCurrentInstance());
+        }
+
+        @Override
+        public String getStyleClass(String addlStyle)
+        {
+            return null;
+        }
+
+        @Override
+        public boolean isInsideUIData()
+        {
+            return false;
+        }
+
+        @Override
+        public void setValue(Object value)
+        {
+            throw new NotSupportedException(SelectTag.this, "setValue");
+        }
+
+        @Override
+        public void validate(Object value)
+        {
+        }
+
+        @Override
+        public boolean isRequired()
+        {
+            return !(SelectTag.this.isAllowNull());
+        }
+
+        @Override
+        public boolean isDisabled()
+        {
+            return SelectTag.this.isDisabled();
+        }
+
+        @Override
+        public boolean isFieldReadOnly()
+        {
+            return false;
+        }
+
+        @Override
+        public String getInputId()
+        {
+            return "select";
+        }
+
+        @Override
+        public boolean hasError()
+        {
+            return false;
+        }
+
+        @Override
+        public Object getAttribute(String name)
+        {
+            return null;
+        }
+
+        @Override
+        public Object getAttributeEx(String name)
+        {
+            Object value = SelectTag.this.getAttributes().get(name);
+            if (value==null)
+            {   // try value expression
+                ValueExpression ve = SelectTag.this.getValueExpression(name);
+                if (ve!=null)
+                {   // It's a value expression
+                    FacesContext ctx = FacesContext.getCurrentInstance();
+                    value = ve.getValue(ctx.getELContext());
+                }
+            }
+            return value;
+        }
+        
+    }
+    
+    private SelectInputInfo selectInputInfo = new SelectInputInfo();
+    
     public SelectTag()
     {
         log.trace("component select created");
@@ -105,9 +245,7 @@ public class SelectTag extends UIInput implements 
NamingContainer
                 boolean disabled = isDisabled();
                 ((HtmlSelectOneMenu) inputComponent).setDisabled(disabled);
                 // Options (sync)
-                Options options = getOptionList();
-                boolean hasEmpty = isAllowNull() && !options.contains("");
-                control.syncOptions((HtmlSelectOneMenu) inputComponent, 
textResolver, options, hasEmpty, getNullText(), false);
+                control.syncOptions((HtmlSelectOneMenu) inputComponent, 
textResolver, selectInputInfo);
                 setInputValue((HtmlSelectOneMenu) inputComponent);
             }
             else
@@ -229,9 +367,7 @@ public class SelectTag extends UIInput implements 
NamingContainer
         copyAttributes(input);
         input.setId(SELECT_COMPONENT_ID);
         // Options
-        Options options = getOptionList();
-        boolean addEmpty = isAllowNull() && !options.contains("");
-        control.initOptions(input, textResolver, options, addEmpty, 
getNullText());
+        control.initOptions(input, textResolver, selectInputInfo);
         // disabled
         boolean disabled = isDisabled();
         input.setDisabled(disabled);
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
index 935a555..eb497a2 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
@@ -47,7 +47,7 @@ public abstract class InputControl
 {
 
     private static final Logger log                   = 
LoggerFactory.getLogger(InputControl.class);
-
+    
     // format attributes
     public static final String  FORMAT_NULL           = "null:";
     public static final String  FORMAT_NULL_ATTRIBUTE = "format:null";
@@ -759,8 +759,13 @@ public abstract class InputControl
 
     protected Object getFormatOption(ValueInfo vi, String option, String 
columnAttributeName)
     {
+        // direct format provided?
         String format = getFormatOption(vi, option);
-        return (format != null) ? format : 
vi.getColumn().getAttribute(columnAttributeName);
+        if (format!=null)
+            return format;
+        // column format provided?
+        Column column = vi.getColumn();
+        return (column!=null ? column.getAttribute(columnAttributeName) : 
null);
     }
 
     protected String getFormatString(ValueInfo vi, String option, String 
columnAttributeName)
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
index 0f2b0a4..334ae22 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
@@ -132,7 +132,7 @@ public class RadioInputControl extends InputControl
         input.setDisabled(disabled);
         // Options
         Options options = ii.getOptions();
-        boolean addEmpty = getEmptyEntryRequired(ii, disabled) && 
!options.contains("");
+        boolean addEmpty = getEmptyEntryRequired(ii, disabled) && 
!options.containsNull();
         String nullText = (addEmpty) ? getNullText(ii) : "";
         initOptions(input, ii.getTextResolver(), options, addEmpty, nullText);
         // add
@@ -158,7 +158,7 @@ public class RadioInputControl extends InputControl
         input.setDisabled(disabled);
         // Options (sync)
         Options options = ii.getOptions();
-        boolean addEmpty = getEmptyEntryRequired(ii, disabled) && 
!options.contains("");
+        boolean addEmpty = getEmptyEntryRequired(ii, disabled) && 
!options.containsNull();
         String nullText = (addEmpty) ? getNullText(ii) : "";
         syncOptions(input, ii.getTextResolver(), options, addEmpty, nullText);
         // Set Value
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
index 1ece85f..b4c719e 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
@@ -31,10 +31,7 @@ import javax.faces.context.FacesContext;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.OptionEntry;
 import org.apache.empire.commons.Options;
-import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.Column;
-import org.apache.empire.db.exceptions.FieldIllegalValueException;
-import org.apache.empire.db.exceptions.FieldValueOutOfRangeException;
 import org.apache.empire.exceptions.InternalException;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.ItemNotFoundException;
@@ -89,10 +86,7 @@ public class SelectInputControl extends InputControl
         boolean disabled = ii.isDisabled();
         input.setDisabled(disabled);
         // Options
-        Options options = getOptions(ii);
-        boolean addEmpty = isEmptyEntryRequired(options, ii, disabled);
-        String nullText = (addEmpty) ? getNullText(ii) : "";
-        initOptions(input, ii.getTextResolver(), options, addEmpty, nullText);
+        initOptions(input, ii.getTextResolver(), ii);
         // add
         compList.add(input);
         // style
@@ -117,20 +111,7 @@ public class SelectInputControl extends InputControl
         boolean disabled = ii.isDisabled();
         input.setDisabled(disabled);
         // Options (sync)
-        Options options = ii.getOptions();
-        if (options!=null)
-        {   // syncOptions
-            boolean addEmpty = isEmptyEntryRequired(options, ii, disabled);
-            String nullText = (addEmpty) ? getNullText(ii) : "";
-            syncOptions(input, ii.getTextResolver(), options, addEmpty, 
nullText, ii.isInsideUIData());
-        }
-        else
-        {   // clear or not?
-            if (ii.getValue(false)!=null)
-                log.warn("No options have been set for column {}", 
ii.getColumn().getName());
-            else
-                input.getChildren().clear();
-        }
+        syncOptions(input, ii.getTextResolver(), ii);
         // set value
         if (setValue)
         {   // style
@@ -141,37 +122,73 @@ public class SelectInputControl extends InputControl
         }
     }
 
-    protected boolean isEmptyEntryRequired(Options options, InputInfo ii, 
boolean disabled)
+    protected boolean isEmptyEntryRequired(Options options, InputInfo ii, 
Object currentValue)
     {
-        if (options.contains(""))
+        if (options!=null && options.containsNull())
         {   // already has an empty option
             return false;
         }
-        if (!ii.isRequired() && !(disabled && ii.getColumn().isRequired()))
-        {
-            return true;
+        if (!ii.isRequired())
+        {   // check disabled and column
+            Column column = ii.getColumn(); 
+            if (!(ii.isDisabled() && (column==null || 
ii.getColumn().isRequired())))
+            {
+                return true;
+            }
         }
         // Check Value
-        return (ii.getValue(true) == null);
+        return ObjectUtils.isEmpty(currentValue);
     }
 
-    public void initOptions(HtmlSelectOneMenu input, TextResolver 
textResolver, Options options, boolean addEmpty, String nullText)
+    public void initOptions(HtmlSelectOneMenu input, TextResolver 
textResolver, InputInfo ii)
     {
-        if (addEmpty)
-        { // Empty entry
-            addSelectItem(input, textResolver, new OptionEntry(null, 
nullText));
+        // get the options
+        Options options = ii.getOptions();
+        if (options==null)
+        {   // invalid options
+            if (ii.getColumn()!=null)
+                log.warn("No options given for column {}", 
ii.getColumn().getName());
+            else
+                log.warn("No options given for select tag {}", 
input.getClientId());
+            options = new Options();
+        }
+        // current 
+        Object currentValue = ii.getValue(true);
+        if (isEmptyEntryRequired(options, ii, currentValue))
+        {   // Empty entry
+            addSelectItem(input, textResolver, new OptionEntry(null, 
getNullText(ii)));
         }
         if (options != null && options.size() > 0)
-        { // Add options
-            for (OptionEntry e : options)
-            { // Option entries
-                addSelectItem(input, textResolver, e);
+        {   // Add options
+            for (OptionEntry oe : options)
+            {   // Option entries
+                if (oe.isActive() || ObjectUtils.compareEqual(oe.getValue(), 
currentValue))
+                {   // add active or current item   
+                    addSelectItem(input, textResolver, oe);
+                }
+                else if (log.isDebugEnabled())
+                {   // not active, ignore this one
+                    log.debug("Select item {} is not active.", oe.getValue());
+                }
             }
         }
     }
     
-    public void syncOptions(HtmlSelectOneMenu input, TextResolver 
textResolver, Options options, boolean hasEmpty, String nullText, boolean 
isInsideUIData)
+    public void syncOptions(HtmlSelectOneMenu input, TextResolver 
textResolver, InputInfo ii)
     {
+        // get the options
+        Options options = ii.getOptions();
+        if (options==null)
+        {   // clear or not?
+            if (ii.getValue(false)!=null)
+                log.warn("No options have been set for column {}", 
ii.getColumn().getName());
+            else
+                input.getChildren().clear();
+            return;
+        }
+        Object currentValue = ii.getValue(true);
+        boolean hasEmpty = isEmptyEntryRequired(options, ii, currentValue);
+        // boolean isInsideUIData = ii.isInsideUIData();
         // Compare child-items with options
         Iterator<OptionEntry> ioe = options.iterator();
         OptionEntry oe = (ioe.hasNext() ? ioe.next() : null);
@@ -206,11 +223,16 @@ public class SelectInputControl extends InputControl
             }
             // Not equal - do a full reload
             input.getChildren().clear();
-            if (hasEmpty)
-                addSelectItem(input, textResolver, new OptionEntry("", 
nullText));
-            for (OptionEntry e : options)
-            { // Option entries
-                addSelectItem(input, textResolver, e);
+            if (hasEmpty) {
+                // add empty entry
+                addSelectItem(input, textResolver, new OptionEntry("", 
getNullText(ii)));
+            }
+            for (OptionEntry opt : options)
+            {   // Option entries
+                if (opt.isActive() || ObjectUtils.compareEqual(opt.getValue(), 
currentValue))
+                {   // add active or current item
+                    addSelectItem(input, textResolver, opt);
+                }
             }
             // done
             return;
@@ -218,16 +240,19 @@ public class SelectInputControl extends InputControl
         // check empty entry
         if (hasEmpty && !emptyPresent)
         {   // add missing empty entry
-            addSelectItem(input, textResolver, new OptionEntry("", nullText), 
0);
+            addSelectItem(input, textResolver, new OptionEntry("", 
getNullText(ii)), 0);
         }
         // Are there any items left?
         while (oe != null)
-        { // add missing item
-            addSelectItem(input, textResolver, oe);
+        {   // add missing item
+            if (oe.isActive() || ObjectUtils.compareEqual(oe.getValue(), 
currentValue))
+            {   // add item
+                addSelectItem(input, textResolver, oe);
+            }
             oe = (ioe.hasNext() ? ioe.next() : null);
         }
     }
-
+    
     public void addSelectItem(UIComponent input, TextResolver textResolver, 
OptionEntry e, int pos)
     {
         UISelectItem selectItem = new UISelectItem();
@@ -303,6 +328,7 @@ public class SelectInputControl extends InputControl
             if ((enumType instanceof Class<?>)) 
             {   // Convert ordinal value to Enum
                 int ordinal = ObjectUtils.getInteger(value);
+                @SuppressWarnings("unchecked")
                 Class<? extends Enum<?>> enumTypeClazz = (Class<? extends 
Enum<?>>)enumType;
                 Enum<?>[] items = enumTypeClazz.getEnumConstants();
                 if (ordinal>=0 && ordinal<items.length)
@@ -358,85 +384,4 @@ public class SelectInputControl extends InputControl
         return value;
     }
 
-    /**
-     * gets the options in a safe way (not null)
-     * @param ii
-     * @return the options for this column
-     */
-    protected Options getOptions(InputInfo ii)
-    {
-        Options options = ii.getOptions();
-        if (options==null)
-        {
-            log.warn("No options given for column {}", 
ii.getColumn().getName());
-            options = new Options();
-        }
-        return options;
-    }
-    
-    /*
-    @Override
-    public void renderInput(ResponseWriter writer, ControlInfo ci)
-    {
-        boolean disabled = ci.getDisabled();
-    
-        HtmlTag input = writer.startTag("select");
-        input.addAttribute("id",    ci.getId());
-        input.addAttribute("class", ci.getCssClass());
-        input.addAttribute("style", ci.getCssStyle());
-        if (disabled)
-        {
-            input.addAttribute("disabled");
-        } else
-        {
-            input.addAttribute("name", ci.getName());
-        }
-        // Event Attributes
-        input.addAttribute("onclick",   ci.getOnclick());
-        input.addAttribute("onchange",  ci.getOnchange());
-        input.addAttribute("onfocus",   ci.getOnfocus());
-        input.addAttribute("onblur",    ci.getOnblur());
-        input.beginBody(true);
-        // Render List of Options
-        Options options = ci.getOptions();
-        if (options!=null)
-        {   // Render option list
-            Object current = ci.getValue();
-            if (hasFormatOption(ci, "allownull") && 
options.contains(null)==false)
-            {   // add an empty entry
-                addEmtpyEntry(writer, ObjectUtils.isEmpty(current));
-            }
-            for (OptionEntry entry : options)
-            {
-                Object value = entry.getValue();
-                boolean isCurrent = ObjectUtils.compareEqual(current, value);
-                if (isCurrent == false && disabled)
-                    continue; // 
-                // Add Option entry
-                HtmlTag option = writer.startTag("option");
-                option.addAttributeNoCheck("value", value, true);
-                option.addAttribute("selected", isCurrent);
-                option.beginBody(ci.getTranslation(entry.getText()));
-                option.endTag(true);
-            }
-        }
-        else
-        {   // No Option list available
-            log.error("No options available for select input control.");
-        }
-        // done
-        input.endTag();
-    }
-    
-    private void addEmtpyEntry(HtmlWriter writer, boolean isCurrent)
-    {
-        // Add Option entry
-        HtmlTag option = writer.startTag("option");
-        option.addAttributeNoCheck("value", "", false);
-        option.addAttribute("selected", isCurrent);
-        option.beginBody("");
-        option.endTag(true);
-    }
-    */
-
 }
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/BeanListPageElement.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/BeanListPageElement.java
index 8da9047..e248852 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/BeanListPageElement.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/BeanListPageElement.java
@@ -28,7 +28,6 @@ import org.apache.commons.beanutils.BeanUtils;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.Column;
-import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBColumnExpr;
 import org.apache.empire.db.DBCommand;
@@ -37,7 +36,6 @@ import org.apache.empire.db.DBDriverFeature;
 import org.apache.empire.db.DBReader;
 import org.apache.empire.db.DBRecordData;
 import org.apache.empire.db.DBRowSet;
-import org.apache.empire.db.exceptions.NoPrimaryKeyException;
 import org.apache.empire.db.expr.order.DBOrderByExpr;
 import org.apache.empire.exceptions.InternalException;
 import org.apache.empire.exceptions.InvalidArgumentException;
diff --git a/empire-db/src/main/java/org/apache/empire/commons/OptionEntry.java 
b/empire-db/src/main/java/org/apache/empire/commons/OptionEntry.java
index e297ea3..a01b38b 100644
--- a/empire-db/src/main/java/org/apache/empire/commons/OptionEntry.java
+++ b/empire-db/src/main/java/org/apache/empire/commons/OptionEntry.java
@@ -31,13 +31,20 @@ public class OptionEntry implements Serializable
 {
        private static final long serialVersionUID = 1L;
        
-       private Object value;
+       private final Object value;
     private String text;
+    private boolean active;
     
-    public OptionEntry(Object value, String text)
+    public OptionEntry(Object value, String text, boolean active)
     {
         this.value = value;
         this.text = text;
+        this.active = active;
+    }
+    
+    public OptionEntry(Object value, String text)
+    {
+        this(value, text, true);
     }
 
     public Object getValue()
@@ -71,4 +78,14 @@ public class OptionEntry implements Serializable
     {
         this.text = text;
     }
+
+    public boolean isActive()
+    {
+        return active;
+    }
+
+    public void setActive(boolean active)
+    {
+        this.active = active;
+    }
 }
diff --git a/empire-db/src/main/java/org/apache/empire/commons/Options.java 
b/empire-db/src/main/java/org/apache/empire/commons/Options.java
index 13f4c34..8bf29cd 100644
--- a/empire-db/src/main/java/org/apache/empire/commons/Options.java
+++ b/empire-db/src/main/java/org/apache/empire/commons/Options.java
@@ -92,9 +92,9 @@ public class Options extends AbstractSet<OptionEntry> 
implements Cloneable, Seri
         return -1;
     }
     
-    protected OptionEntry createOptionEntry(Object value, String text)
+    protected OptionEntry createOptionEntry(Object value, String text, boolean 
active)
     {
-        return new OptionEntry(value, text);
+        return new OptionEntry(value, text, active);
     }
 
     public OptionEntry getEntry(Object value)
@@ -109,6 +109,12 @@ public class Options extends AbstractSet<OptionEntry> 
implements Cloneable, Seri
         return (i >= 0 ? list.get(i).getText() : EMPTY_STRING);
     }
 
+    public boolean isActive(Object value)
+    {
+        int i = getIndex(value);
+        return (i >= 0 ? list.get(i).isActive() : false);
+    }
+
     /**
      * Gets the value of the entry at index i
      * 
@@ -148,7 +154,7 @@ public class Options extends AbstractSet<OptionEntry> 
implements Cloneable, Seri
      * @param text the text
      * @param pos the position, see {@link InsertPos}
      */
-    public void set(Object value, String text, InsertPos pos)
+    public void set(Object value, String text, boolean active, InsertPos pos)
     {
         if (text == null)
         { // text must not be null!
@@ -170,11 +176,23 @@ public class Options extends AbstractSet<OptionEntry> 
implements Cloneable, Seri
             else // bottom is default
                 index = list.size();
             // add entry now
-            list.add(index, createOptionEntry(value, text));
+            list.add(index, createOptionEntry(value, text, active));
         }
     }
 
     /**
+     * Sets or Adds an option at a certain position
+     * 
+     * @param value the value object
+     * @param text the text
+     * @param pos the position, see {@link InsertPos}
+     */
+    public void set(Object value, String text, InsertPos pos)
+    {
+        set(value, text, true, pos);
+    }
+    
+    /**
      * Sets or adds Adds an option at the bottom
      * 
      * @param value the value object
@@ -193,15 +211,18 @@ public class Options extends AbstractSet<OptionEntry> 
implements Cloneable, Seri
      * @param text the text
      * @param noCheck set to true to skip testing for an existing key (handle 
with care!)
      */
-    public void add(Object value, String text, boolean noCheck)
+    public void add(Object value, String text, boolean active)
     {
-        if (noCheck)
-        { 
-            list.add(createOptionEntry(value, text));
-        } 
+        int i = getIndex(value);
+        if (i >= 0) 
+        {
+            OptionEntry oe = list.get(i);
+            oe.setText(text);
+            oe.setActive(active);
+        }
         else
         {
-            set(value, text);
+            list.add(createOptionEntry(value, text, active));
         }
     }
 
@@ -227,12 +248,24 @@ public class Options extends AbstractSet<OptionEntry> 
implements Cloneable, Seri
     }
 
     @Override
-    public boolean contains(Object object)
-    {
-        // Check if exits
-        return (getIndex(object) >= 0);
+    public boolean contains(Object value)
+    {   // Check if exits
+        return (getIndex(value) >= 0);
     }
 
+    public boolean containsNull()
+    {   // Check if exits
+        return (getIndex("") >= 0);
+    }
+    
+    /**
+     * same as contains(), but IDE may not issue warning
+     */
+    public boolean exists(Object value)
+    {   // Check if exits
+        return (getIndex(value) >= 0);
+    }
+    
     @Override
     public boolean isEmpty()
     {
diff --git a/empire-db/src/test/java/org/apache/empire/commons/OptionsTest.java 
b/empire-db/src/test/java/org/apache/empire/commons/OptionsTest.java
index 9600d5e..73e738b 100644
--- a/empire-db/src/test/java/org/apache/empire/commons/OptionsTest.java
+++ b/empire-db/src/test/java/org/apache/empire/commons/OptionsTest.java
@@ -136,7 +136,7 @@ public class OptionsTest
     public void testCreateOptionEntry()
     {
         Options options = new Options();
-        OptionEntry entry = options.createOptionEntry(Integer.valueOf(123), 
"test");
+        OptionEntry entry = options.createOptionEntry(Integer.valueOf(123), 
"test", true);
         assertEquals("test", entry.getText());
         assertEquals(Integer.valueOf(123), entry.getValue());
     }

Reply via email to