/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2015, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * */ package org.apache.sis.feature; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.apache.sis.feature.AbstractIdentifiedType.*; import org.geotoolkit.util.NamesExt; import org.opengis.feature.AttributeType; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.util.GenericName; import org.apache.sis.internal.feature.AttributeConvention; /** * * @author Johann Sorel (Geomatys) */ public class SingleAttributeTypeBuilder { private final Map parameters = new HashMap(); private final List<AttributeType> atts = new ArrayList<>(); private Class valueClass; private int minimumOccurs; private int maximumOccurs; private Object defaultValue; public SingleAttributeTypeBuilder() { minimumOccurs = 1; maximumOccurs = 1; } public SingleAttributeTypeBuilder reset(){ parameters.clear(); atts.clear(); valueClass = null; minimumOccurs = 1; maximumOccurs = 1; defaultValue = null; return this; } public SingleAttributeTypeBuilder copy(AttributeType base){ setName(base.getName()); setDefinition(base.getDefinition()); setDescription(base.getDescription()); setDesignation(base.getDesignation()); atts.addAll(base.characteristics().values()); valueClass = base.getValueClass(); minimumOccurs = base.getMinimumOccurs(); maximumOccurs = base.getMaximumOccurs(); defaultValue = base.getDefaultValue(); return this; } public SingleAttributeTypeBuilder setName(String localPart){ this.setName(null,localPart); return this; } public SingleAttributeTypeBuilder setName(String namespace, String localPart){ setName(NamesExt.create(namespace, localPart)); return this; } public SingleAttributeTypeBuilder setName(GenericName name) { parameters.put(DefaultAttributeType.NAME_KEY, name); return this; } public GenericName getName(){ return GenericName.class.cast(parameters.get(DefaultAttributeType.NAME_KEY)); } public SingleAttributeTypeBuilder setDescription(CharSequence description){ parameters.put(DESCRIPTION_KEY, description); return this; } public CharSequence getDescription(){ return CharSequence.class.cast(parameters.get(DESCRIPTION_KEY)); } public SingleAttributeTypeBuilder setDesignation(CharSequence designation){ parameters.put(DESIGNATION_KEY, designation); return this; } public CharSequence getDesignation(){ return CharSequence.class.cast(parameters.get(DESIGNATION_KEY)); } public SingleAttributeTypeBuilder setDefinition(CharSequence definition){ parameters.put(DEFINITION_KEY, definition); return this; } public CharSequence getDefinition(){ return CharSequence.class.cast(parameters.get(DEFINITION_KEY)); } public SingleAttributeTypeBuilder setValueClass(Class valueClass) { this.valueClass = valueClass; return this; } public Class getValueClass(){ return valueClass; } public SingleAttributeTypeBuilder setDefaultValue(Object defaultValue) { this.defaultValue = defaultValue; return this; } public Object getDefaultValue() { return defaultValue; } public SingleAttributeTypeBuilder setMinimumOccurs(int minimumOccurs) { this.minimumOccurs = minimumOccurs; return this; } public int getMinimumOccurs() { return minimumOccurs; } public SingleAttributeTypeBuilder setMaximumOccurs(int maximumOccurs) { this.maximumOccurs = maximumOccurs; return this; } public int getMaximumOccurs() { return maximumOccurs; } /** * Set maximum string length * @param length * @return created attribute */ public SingleAttributeTypeBuilder setLength(int length){ return addCharacteristic(AttributeConvention.MAXIMAL_LENGTH_CHARACTERISTIC, Integer.class, 0, 1, length); } public SingleAttributeTypeBuilder setCRS(CoordinateReferenceSystem crs){ return addCharacteristic(AttributeConvention.CRS_CHARACTERISTIC, CoordinateReferenceSystem.class, 0, 1, crs); } public SingleAttributeTypeBuilder setPossibleValues(Collection values){ return addCharacteristic(AttributeConvention.VALID_VALUES_CHARACTERISTIC, Object.class, 0, 1, values); } public SingleAttributeTypeBuilder addCharacteristic(String localPart, Class valueClass, int minimumOccurs, int maximumOccurs, Object defaultValue){ final GenericName name = NamesExt.create(localPart); return addCharacteristic(name,valueClass,minimumOccurs,maximumOccurs,defaultValue); } public SingleAttributeTypeBuilder addCharacteristic(GenericName name, Class valueClass, int minimumOccurs, int maximumOccurs, Object defaultValue){ return addCharacteristic(new DefaultAttributeType( Collections.singletonMap(NAME_KEY, name), valueClass,minimumOccurs,maximumOccurs,defaultValue)); } public SingleAttributeTypeBuilder addCharacteristic(AttributeType characteristic){ //search and remove previous characteristic with the same id if it exist for(AttributeType at : atts){ if(at.getName().equals(characteristic.getName())){ atts.remove(at); break; } } atts.add(characteristic); return this; } public AttributeType build(){ return new DefaultAttributeType(parameters, valueClass, minimumOccurs, maximumOccurs, defaultValue, atts.toArray(new AttributeType[atts.size()])); } public static AttributeType create(GenericName name, Class valueClass) { return new DefaultAttributeType(Collections.singletonMap("name", name), valueClass, 1, 1, null); } }