package com.ximple.eofms.filter; import java.util.List; import org.geotools.feature.AttributeTypeFactory; 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.vividsolutions.jts.geom.Geometry; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; import com.ximple.io.dgn7.TextElement; import com.ximple.io.dgn7.UserAttributeData; import com.ximple.io.dgn7.TextNodeElement; import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator; public class CreateTextStrategy implements CreateFeatureTypeStrategy { GeometryFactory geometryFactory = new GeometryFactory(); FeatureTypeBuilder typeBuilder = null; TWD97GeometryConverterDecorator convertDecordator = new TWD97GeometryConverterDecorator(); public CreateTextStrategy() { } 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 (typeBuilder == null) { typeBuilder = FeatureTypeBuilder.newInstance(featureName); typeBuilder.addType(AttributeTypeFactory.newAttributeType("GEOM", Geometry.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("TID", Integer.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("OID", Long.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("CID", Integer.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("LID", Integer.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("LEVEL", Integer.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMCOLOR", Integer.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMWEIGHT", Integer.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMSTYLE", Integer.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("FONT", String.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("JUST", Integer.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("HEIGHT", Double.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("WIDTH", Double.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("ANGLE", Double.class)); typeBuilder.addType(AttributeTypeFactory.newAttributeType("CONTEXT", String.class)); } return typeBuilder.getFeatureType(); } public Feature createFeature(FeatureType featureType, Element element) throws IllegalAttributeException { FrammeAttributeData fLinkage = getFeatureLinkage(element); if (fLinkage == null) return null; if (element instanceof TextElement) { TextElement txtElement = (TextElement) element; convertDecordator.setConverter(txtElement); Feature feature = featureType.create(new Object[]{ convertDecordator.toGeometry(geometryFactory), (int) fLinkage.getFsc(), (long) fLinkage.getUfid(), (int) fLinkage.getComponentID(), 0, txtElement.getLevelIndex(), txtElement.getColorIndex(), txtElement.getWeight(), txtElement.getLineStyle(), txtElement.getFontIndex(), txtElement.getJustification(), txtElement.getTextHeight(), txtElement.getTextWidth(), txtElement.getRotationAngle(), txtElement.getText() }); return feature; } else if (element instanceof TextNodeElement) { TextNodeElement nodeElement = (TextNodeElement) element; convertDecordator.setConverter(nodeElement); String[] texts = nodeElement.getTextArray(); StringBuffer sb = new StringBuffer(); for (String text : texts) { if (sb.length() != 0) sb.append("\n"); sb.append(text); } Feature feature = featureType.create(new Object[]{ convertDecordator.toGeometry(geometryFactory), (int) fLinkage.getFsc(), (long) fLinkage.getUfid(), (int) fLinkage.getComponentID(), 0, nodeElement.getLevelIndex(), nodeElement.getColorIndex(), nodeElement.getWeight(), nodeElement.getLineStyle(), nodeElement.getFontIndex(), nodeElement.getJustification(), nodeElement.getTextNodeHeight(), nodeElement.getTextNodeLength(), nodeElement.getRotationAngle(), sb.toString() }); return feature; } return null; } }