package com.ximple.eofms.filter; import java.util.List; import java.util.TreeMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.geotools.feature.Feature; import org.geotools.feature.FeatureType; import org.geotools.feature.FeatureTypeBuilder; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.SchemaException; import com.vividsolutions.jts.geom.GeometryFactory; import com.ximple.eofms.util.DefaultColorTable; import com.ximple.eofms.util.FeatureTypeBuilderUtil; import com.ximple.eofms.util.TWD97GeometryConverterDecorator; import com.ximple.io.dgn7.ComplexShapeElement; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; import com.ximple.io.dgn7.ShapeElement; import com.ximple.io.dgn7.UserAttributeData; public class CreateShapeStrategy implements CreateFeatureTypeStrategy { static final Log logger = LogFactory.getLog(CreateShapeStrategy.class); GeometryFactory geometryFactory = new GeometryFactory(); TreeMap typeBuilders = new TreeMap(); TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator(); public CreateShapeStrategy() { } protected FrammeAttributeData getFeatureLinkage(Element element) { if (!element.hasUserAttributeData()) return null; List usrDatas = element.getUserAttributeData(); for (UserAttributeData anUsrData : usrDatas) { if (anUsrData instanceof FrammeAttributeData) { return (FrammeAttributeData) anUsrData; } } return null; } public FeatureType createFeatureElement(String featureName) throws SchemaException { if (!typeBuilders.containsKey(featureName)) { FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createPolygonFeatureTypeBuilder(featureName); typeBuilders.put(featureName, typeBuilder); } return typeBuilders.get(featureName).getFeatureType(); } public Feature createFeature(FeatureType featureType, Element element) throws IllegalAttributeException { DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance(); FrammeAttributeData fLinkage = getFeatureLinkage(element); Feature feature = null; if (fLinkage == null) return null; if (element instanceof ShapeElement) { ShapeElement shapeElement = (ShapeElement) element; convertDecorator.setConverter(shapeElement); feature = featureType.create(new Object[]{ convertDecorator.toGeometry(geometryFactory), fLinkage.getFsc(), (long) fLinkage.getUfid(), (short) fLinkage.getComponentID(), (short) 0, (short) shapeElement.getLevelIndex(), colorTable.getColorCode(shapeElement.getColorIndex()), (short) shapeElement.getWeight(), (short) shapeElement.getLineStyle() }); } else if (element instanceof ComplexShapeElement) { ComplexShapeElement complexShape = (ComplexShapeElement) element; convertDecorator.setConverter(complexShape); feature = featureType.create(new Object[]{ convertDecorator.toGeometry(geometryFactory), fLinkage.getFsc(), (long) fLinkage.getUfid(), (short) fLinkage.getComponentID(), (short) 0, (short) complexShape.getLevelIndex(), colorTable.getColorCode(complexShape.getColorIndex()), (short) complexShape.getWeight(), (short) complexShape.getLineStyle() }); } return feature; } }