Revision 45014 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureAttributeDescriptor.java

View differences:

DefaultFeatureAttributeDescriptor.java
35 35
import java.util.Map;
36 36
import java.util.Map.Entry;
37 37
import java.util.Objects;
38
import javax.json.JsonObject;
38 39
import org.apache.commons.lang3.ArrayUtils;
39 40
import org.apache.commons.lang3.StringUtils;
41
import org.apache.commons.lang3.tuple.Pair;
40 42
import org.cresques.cts.IProjection;
43
import org.gvsig.expressionevaluator.Expression;
41 44
import org.gvsig.expressionevaluator.ExpressionUtils;
42 45
import org.gvsig.fmap.dal.DALLocator;
43 46
import org.gvsig.fmap.dal.DataStore;
44 47
import org.gvsig.fmap.dal.DataTypes;
45 48
import org.gvsig.fmap.dal.feature.DataProfile;
49
import org.gvsig.fmap.dal.feature.Feature;
46 50
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
47 51
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
48 52
import org.gvsig.fmap.dal.feature.FeatureAttributeGetter;
......
87 91
import org.slf4j.LoggerFactory;
88 92
import org.gvsig.tools.dataTypes.CoercionContext;
89 93
import org.gvsig.tools.dataTypes.DataType.NumberPrecisionAndScale;
94
import org.gvsig.tools.util.GetItemWithSize;
95
import org.gvsig.tools.util.LabeledValue;
90 96

  
91 97
@SuppressWarnings("UseSpecificCatch")
92 98
public class DefaultFeatureAttributeDescriptor implements
......
126 132
  protected boolean allowIndexDuplicateds = true;
127 133

  
128 134
  protected DynObjectValueItem[] availableValues;
135
  protected DynObjectValueItem[] availableValuesCache; // No persistente
136
  protected Expression availableValuesExpression;
129 137
  private Map<Object, String> labelOfValueMap; // No persistente
130 138
  protected String description;
131 139
  protected Object minValue;
......
900 908

  
901 909
  @Override
902 910
  public DynObjectValueItem[] getAvailableValues() {
903
    if (this.availableValues == null) {
904
      if (this.isForeingKey() && this.foreingKey.isClosedList()) {
905
        return this.foreingKey.getAvailableValues(null);
906
      }
911
    if (this.availableValues != null) {
912
        return this.availableValues;
907 913
    }
908
    return this.availableValues;
914
    if (this.availableValuesCache != null) {
915
        return this.availableValuesCache;
916
    }
917
    if (this.isForeingKey() && this.foreingKey.isClosedList()) {
918
      this.availableValuesCache = this.foreingKey.getAvailableValues(null);
919

  
920
    } else if( this.availableValuesExpression!=null ) {
921
      this.availableValuesCache = this.getAvailableValuesFromExpression();
922
    }
923
    return this.availableValuesCache;
909 924
  }
925
  
926
    private DynObjectValueItem[] getAvailableValuesFrom(GetItemWithSize values) {
927
        if (values.size() == 0) {
928
            return null;
929
        }
930
        DynObjectValueItem[] r = null;
931
        Object firstelement = values.get(0);
932
        if (firstelement instanceof LabeledValue) {
933
            r = new DynObjectValueItem[values.size()];
934
            for (int i = 0; i < values.size(); i++) {
935
                LabeledValue v = (LabeledValue) values.get(i);
936
                r[i] = new DynObjectValueItem(
937
                        v.getValue(),
938
                        Objects.toString(v.getLabel(), Objects.toString(v.getValue(), String.valueOf(i)))
939
                );
940
            }
941
        } else if (firstelement instanceof Pair) {
942
            r = new DynObjectValueItem[values.size()];
943
            for (int i = 0; i < values.size(); i++) {
944
                Pair v = (Pair) values.get(i);
945
                r[i] = new DynObjectValueItem(
946
                        v.getValue(),
947
                        Objects.toString(v.getKey(), Objects.toString(v.getValue(), String.valueOf(i)))
948
                );
949
            }
950
        } else if (firstelement instanceof JsonObject) {
951
            JsonObject v = (JsonObject) firstelement;
952
            String labelname = null;
953
            for (String theName : new String[]{
954
                "name", "label", "key", "description"
955
            }) {
956
                if (v.containsKey(theName)) {
957
                    labelname = theName;
958
                    break;
959
                }
960
                if (v.containsKey(theName.toUpperCase())) {
961
                    labelname = theName.toLowerCase();
962
                    break;
963
                }
964
            }
965
            String valuename = null;
966
            if (v.containsKey("value")) {
967
                valuename = "value";
968
            }
969
            r = new DynObjectValueItem[values.size()];
970
            for (int i = 0; i < values.size(); i++) {
971
                v = (JsonObject) values.get(i);
972
                String theLabel;
973
                Object theValue;
974
                if (labelname == null) {
975
                    theLabel = v.getString(labelname);
976
                } else {
977
                    theLabel = v.toString();
978
                }
979
                if (valuename == null) {
980
                    theValue = v.getString(valuename);
981
                } else {
982
                    theValue = v;
983
                }
984
                r[i] = new DynObjectValueItem(theValue, theLabel);
985
            }
986
        } else if (firstelement instanceof Feature) {
987
            Feature v = (Feature) firstelement;
988
            FeatureType featureType = v.getType();
989
            String valuename = null;
990
            FeatureAttributeDescriptor[] pks = featureType.getPrimaryKey();
991
            if( pks!=null && pks.length == 1) {
992
                valuename = pks[0].getName();
993
            }
994
            String labelname = null;
995
            for (String theName : new String[]{
996
                "name", "label", "key", "description"
997
            }) {
998
                if (featureType.get(theName)!=null ) {
999
                    labelname = theName;
1000
                    break;
1001
                }
1002
            }
1003
            r = new DynObjectValueItem[values.size()];
1004
            for (int i = 0; i < values.size(); i++) {
1005
                v = (Feature) values.get(i);
1006
                String theLabel;
1007
                Object theValue;
1008
                if (labelname == null) {
1009
                    theLabel = v.getString(labelname);
1010
                } else {
1011
                    theLabel = v.toString();
1012
                }
1013
                if( valuename == null ) {
1014
                    theValue = v.get(valuename);
1015
                } else {
1016
                    theValue = v.getReference().getCode();
1017
                }
1018
                r[i] = new DynObjectValueItem(theValue, theLabel);
1019
            }
1020
        }
1021
        return r;
1022
    }
1023
  
910 1024

  
1025
  private DynObjectValueItem[] getAvailableValuesFromExpression() {
1026
      if( this.availableValuesExpression == null || this.availableValuesExpression.isEmpty() ) {
1027
          return null;
1028
      }
1029
      Object value = this.availableValuesExpression.execute(null);
1030
      if( value instanceof DynObjectValueItem[] ) {
1031
          return (DynObjectValueItem[]) value;
1032
      }
1033
      if( value instanceof List ) {
1034
          return this.getAvailableValuesFrom(new GetItemWithSize() {
1035
              @Override
1036
              public Object get(int i) {
1037
                  return ((List)value).get(i);
1038
              }
1039

  
1040
              @Override
1041
              public int size() {
1042
                  return ((List)value).size();
1043
              }
1044
          });
1045
      }
1046
      return null;
1047
  }
1048

  
911 1049
  @Override
1050
  public Expression getAvailableValuesExpression() {
1051
      return this.availableValuesExpression;
1052
  }
1053
  
1054
  @Override
1055
    public FeatureAttributeDescriptor setAvailableValuesExpression(String expression) {
1056
        if (StringUtils.isBlank(expression)) {
1057
            this.availableValuesExpression = null;
1058
            return this;
1059
        }
1060
        this.availableValuesExpression = ExpressionUtils.createExpression(expression);
1061
        return this;
1062
    }
1063

  
1064
  @Override
1065
    public FeatureAttributeDescriptor setAvailableValuesExpression(Expression expression) {
1066
        this.availableValuesExpression = expression;
1067
        return this;
1068
    }
1069
  
1070
  @Override
912 1071
  public String getLabelOfValue(Object value) {
913 1072
    if (this.labelOfValueMap != null) {
914 1073
      String theLabel = this.labelOfValueMap.get(value);

Also available in: Unified diff