update for EOFM-116, EOFM-117
21 files modified
2 files added
| | |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/AbstractFLinkageDispatchableFilter.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateFeatureTypeEventListener.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateFeatureTypeStrategy.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java svneol=native#text/plain |
| | |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementLevelCriterion.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementTypeCriterion.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/FeatureTypeEvent.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java svneol=native#text/plain |
| | | xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java svneol=native#text/plain |
| | |
| | | |
| | | # Print messages of level INFO or above for examples |
| | | log4j.logger.org.cavaness.quartzbook=INFO |
| | | log4j.logger.com.ximple.eofms=INFO |
| | | log4j.logger.com.ximple.eofms=DEBUG |
| | |
| | | |
| | | import java.util.LinkedList; |
| | | |
| | | import javax.swing.event.EventListenerList; |
| | | |
| | | import org.apache.commons.logging.Log; |
| | | import org.apache.commons.logging.LogFactory; |
| | | |
| | |
| | | private LinkedList<ElementLevelCriterion> levelCriterions; |
| | | |
| | | protected Log logger = LogFactory.getLog(AbstractFLinkageDispatchableFilter.class); |
| | | |
| | | // Create the listener list |
| | | protected EventListenerList listenerList = new EventListenerList(); |
| | | |
| | | public AbstractDispatchableFilter() |
| | | { |
| | |
| | | return -1; |
| | | } |
| | | |
| | | public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.add(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.remove(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | protected void fireFeatureTypeEvent(FeatureTypeEvent evt) |
| | | { |
| | | Object[] listeners = listenerList.getListenerList(); |
| | | for (int i = 0; i < listeners.length; i += 2) |
| | | { |
| | | if (listeners[i] == CreateFeatureTypeEventListener.class) |
| | | { |
| | | ((CreateFeatureTypeEventListener) listeners[i + 1]).createFeatureTypeOccurred(evt); |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ximple.eofms.filter; |
| | | |
| | | import java.util.EventListener; |
| | | |
| | | public interface CreateFeatureTypeEventListener extends EventListener |
| | | { |
| | | public void createFeatureTypeOccurred(FeatureTypeEvent evt); |
| | | } |
| | |
| | | public interface CreateFeatureTypeStrategy |
| | | { |
| | | public FeatureType createFeatureElement(String featureName) throws SchemaException; |
| | | |
| | | public Feature createFeature(FeatureType featureType, Element element) throws IllegalAttributeException; |
| | | |
| | | public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener); |
| | | public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener); |
| | | } |
| | |
| | | import java.util.List; |
| | | import java.util.TreeMap; |
| | | |
| | | import javax.swing.event.EventListenerList; |
| | | |
| | | import org.apache.commons.logging.Log; |
| | | import org.apache.commons.logging.LogFactory; |
| | | import org.geotools.feature.Feature; |
| | |
| | | TreeMap<String, FeatureTypeBuilder> typeBuilders = new TreeMap<String, FeatureTypeBuilder>(); |
| | | TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator(); |
| | | |
| | | // Create the listener list |
| | | protected EventListenerList listenerList = new EventListenerList(); |
| | | |
| | | public CreateLineStringStrategy() |
| | | { |
| | | } |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createLineStringFeatureTypeBuilder(featureName); |
| | | typeBuilders.put(featureName, typeBuilder); |
| | | fireFeatureTypeEvent(new FeatureTypeEvent(this, typeBuilder.getFeatureType())); |
| | | } |
| | | return typeBuilders.get(featureName).getFeatureType(); |
| | | } |
| | |
| | | |
| | | return feature; |
| | | } |
| | | |
| | | |
| | | public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.add(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.remove(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | protected void fireFeatureTypeEvent(FeatureTypeEvent evt) |
| | | { |
| | | Object[] listeners = listenerList.getListenerList(); |
| | | for (int i = 0; i < listeners.length; i += 2) |
| | | { |
| | | if (listeners[i] == CreateFeatureTypeEventListener.class) |
| | | { |
| | | ((CreateFeatureTypeEventListener) listeners[i + 1]).createFeatureTypeOccurred(evt); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | import java.util.List; |
| | | import java.util.TreeMap; |
| | | |
| | | import javax.swing.event.EventListenerList; |
| | | |
| | | import org.apache.commons.logging.Log; |
| | | import org.apache.commons.logging.LogFactory; |
| | | import org.geotools.feature.Feature; |
| | |
| | | TreeMap<String, FeatureTypeBuilder> typeBuilders = new TreeMap<String, FeatureTypeBuilder>(); |
| | | TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator(); |
| | | |
| | | // Create the listener list |
| | | protected EventListenerList listenerList = new EventListenerList(); |
| | | |
| | | public CreateLineTextStrategy() |
| | | { |
| | | } |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createLineStringFeatureTypeBuilder(featureName); |
| | | typeBuilders.put(featureName, typeBuilder); |
| | | fireFeatureTypeEvent(new FeatureTypeEvent(this, typeBuilder.getFeatureType())); |
| | | } |
| | | return typeBuilders.get(featureName).getFeatureType(); |
| | | } |
| | |
| | | |
| | | return feature; |
| | | } |
| | | |
| | | |
| | | public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.add(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.remove(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | protected void fireFeatureTypeEvent(FeatureTypeEvent evt) |
| | | { |
| | | Object[] listeners = listenerList.getListenerList(); |
| | | for (int i = 0; i < listeners.length; i += 2) |
| | | { |
| | | if (listeners[i] == CreateFeatureTypeEventListener.class) |
| | | { |
| | | ((CreateFeatureTypeEventListener) listeners[i + 1]).createFeatureTypeOccurred(evt); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | import java.util.List; |
| | | import java.util.TreeMap; |
| | | |
| | | import javax.swing.event.EventListenerList; |
| | | |
| | | import org.apache.commons.logging.Log; |
| | | import org.apache.commons.logging.LogFactory; |
| | | import org.geotools.feature.Feature; |
| | |
| | | GeometryFactory geometryFactory = new GeometryFactory(); |
| | | TreeMap<String, FeatureTypeBuilder> typeBuilders = new TreeMap<String, FeatureTypeBuilder>(); |
| | | TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator(); |
| | | |
| | | // Create the listener list |
| | | protected EventListenerList listenerList = new EventListenerList(); |
| | | |
| | | public CreateShapeStrategy() |
| | | { |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createPolygonFeatureTypeBuilder(featureName); |
| | | typeBuilders.put(featureName, typeBuilder); |
| | | fireFeatureTypeEvent(new FeatureTypeEvent(this, typeBuilder.getFeatureType())); |
| | | } |
| | | return typeBuilders.get(featureName).getFeatureType(); |
| | | } |
| | |
| | | } |
| | | return feature; |
| | | } |
| | | |
| | | |
| | | public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.add(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.remove(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | protected void fireFeatureTypeEvent(FeatureTypeEvent evt) |
| | | { |
| | | Object[] listeners = listenerList.getListenerList(); |
| | | for (int i = 0; i < listeners.length; i += 2) |
| | | { |
| | | if (listeners[i] == CreateFeatureTypeEventListener.class) |
| | | { |
| | | ((CreateFeatureTypeEventListener) listeners[i + 1]).createFeatureTypeOccurred(evt); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | import java.util.List; |
| | | import java.util.TreeMap; |
| | | |
| | | import javax.swing.event.EventListenerList; |
| | | |
| | | import org.apache.commons.logging.Log; |
| | | import org.apache.commons.logging.LogFactory; |
| | | import org.geotools.feature.Feature; |
| | |
| | | GeometryFactory geometryFactory = new GeometryFactory(); |
| | | TreeMap<String, FeatureTypeBuilder> typeBuilders = new TreeMap<String, FeatureTypeBuilder>(); |
| | | TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator(); |
| | | |
| | | // Create the listener list |
| | | protected EventListenerList listenerList = new EventListenerList(); |
| | | |
| | | public CreateSymbolStrategy() |
| | | { |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createSymbolFeatureTypeBuilder(featureName); |
| | | typeBuilders.put(featureName, typeBuilder); |
| | | fireFeatureTypeEvent(new FeatureTypeEvent(this, typeBuilder.getFeatureType())); |
| | | } |
| | | return typeBuilders.get(featureName).getFeatureType(); |
| | | } |
| | |
| | | } |
| | | return feature; |
| | | } |
| | | |
| | | |
| | | public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.add(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.remove(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | protected void fireFeatureTypeEvent(FeatureTypeEvent evt) |
| | | { |
| | | Object[] listeners = listenerList.getListenerList(); |
| | | for (int i = 0; i < listeners.length; i += 2) |
| | | { |
| | | if (listeners[i] == CreateFeatureTypeEventListener.class) |
| | | { |
| | | ((CreateFeatureTypeEventListener) listeners[i + 1]).createFeatureTypeOccurred(evt); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | import java.math.RoundingMode; |
| | | import java.util.List; |
| | | import java.util.TreeMap; |
| | | import javax.swing.event.EventListenerList; |
| | | |
| | | import org.apache.commons.logging.Log; |
| | | import org.apache.commons.logging.LogFactory; |
| | |
| | | TreeMap<String, FeatureTypeBuilder> typeBuilders = new TreeMap<String, FeatureTypeBuilder>(); |
| | | TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator(); |
| | | |
| | | // Create the listener list |
| | | protected EventListenerList listenerList = new EventListenerList(); |
| | | |
| | | public CreateTextStrategy() |
| | | { |
| | | } |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createPointFeatureTypeBuilder(featureName); |
| | | typeBuilders.put(featureName, typeBuilder); |
| | | fireFeatureTypeEvent(new FeatureTypeEvent(this, typeBuilder.getFeatureType())); |
| | | } |
| | | return typeBuilders.get(featureName).getFeatureType(); |
| | | } |
| | |
| | | double angle = txtElement.getRotationAngle(); |
| | | angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); |
| | | convertDecorator.setConverter(txtElement); |
| | | String content = txtElement.getText(); |
| | | content = content.replace('\u0000', ' '); |
| | | feature = featureType.create(new Object[]{ |
| | | convertDecorator.toGeometry(geometryFactory), |
| | | fLinkage.getFsc(), |
| | |
| | | (float) txtElement.getTextHeight(), |
| | | (float) txtElement.getTextWidth(), |
| | | (float) angle, |
| | | txtElement.getText() |
| | | content |
| | | }); |
| | | } else if (element instanceof TextNodeElement) |
| | | { |
| | |
| | | { |
| | | if (sb.length() != 0) |
| | | sb.append("\n"); |
| | | sb.append(text); |
| | | String content = text.replace('\u0000', ' '); |
| | | sb.append(content); |
| | | } |
| | | |
| | | double angle = nodeElement.getRotationAngle(); |
| | |
| | | } |
| | | return feature; |
| | | } |
| | | |
| | | public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.add(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener) |
| | | { |
| | | listenerList.remove(CreateFeatureTypeEventListener.class, listener); |
| | | } |
| | | |
| | | protected void fireFeatureTypeEvent(FeatureTypeEvent evt) |
| | | { |
| | | Object[] listeners = listenerList.getListenerList(); |
| | | for (int i = 0; i < listeners.length; i += 2) |
| | | { |
| | | if (listeners[i] == CreateFeatureTypeEventListener.class) |
| | | { |
| | | ((CreateFeatureTypeEventListener) listeners[i + 1]).createFeatureTypeOccurred(evt); |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ximple.eofms.filter; |
| | | |
| | | import java.util.EventObject; |
| | | |
| | | import org.geotools.feature.FeatureType; |
| | | |
| | | public class FeatureTypeEvent extends EventObject |
| | | { |
| | | private FeatureType featureType; |
| | | |
| | | /** |
| | | * Constructs a prototypical Event. |
| | | * |
| | | * @param source The object on which the Event initially occurred. |
| | | * @param featureType featureType |
| | | * @throws IllegalArgumentException if source is null. |
| | | */ |
| | | public FeatureTypeEvent(Object source, FeatureType featureType) |
| | | { |
| | | super(source); |
| | | this.featureType = featureType; |
| | | } |
| | | |
| | | public FeatureType getFeatureType() |
| | | { |
| | | return featureType; |
| | | } |
| | | } |
| | |
| | | import com.ximple.io.dgn7.FrammeAttributeData; |
| | | |
| | | public class TypeCompIdDispatchableFilter extends AbstractFLinkageDispatchableFilter |
| | | implements CreateFeatureTypeEventListener |
| | | { |
| | | private int tid; |
| | | private int cid; |
| | |
| | | this.tid = tid; |
| | | this.cid = compid; |
| | | this.createStrategy = createStrategy; |
| | | this.createStrategy.addCreateFeatureTypeEventListener(this); |
| | | } |
| | | |
| | | public int getTid() |
| | |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | public void createFeatureTypeOccurred(FeatureTypeEvent evt) |
| | | { |
| | | fireFeatureTypeEvent(evt); |
| | | } |
| | | } |
| | |
| | | import com.ximple.io.dgn7.FrammeAttributeData; |
| | | |
| | | public class TypeCompLevelIdDispatchableFilter extends AbstractFLinkageDispatchableFilter |
| | | implements CreateFeatureTypeEventListener |
| | | { |
| | | private int tid; |
| | | private int cid; |
| | |
| | | this.cid = compid; |
| | | this.lid = level; |
| | | this.createStrategy = createStrategy; |
| | | this.createStrategy.addCreateFeatureTypeEventListener(this); |
| | | } |
| | | |
| | | public int getTid() |
| | |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | public void createFeatureTypeOccurred(FeatureTypeEvent evt) |
| | | { |
| | | fireFeatureTypeEvent(evt); |
| | | } |
| | | } |
| | |
| | | import com.ximple.io.dgn7.Element; |
| | | import com.ximple.io.dgn7.FrammeAttributeData; |
| | | |
| | | public class TypeIdDispatchableFilter extends AbstractFLinkageDispatchableFilter |
| | | public class TypeIdDispatchableFilter extends AbstractFLinkageDispatchableFilter implements CreateFeatureTypeEventListener |
| | | { |
| | | private int tid; |
| | | private CreateFeatureTypeStrategy createStrategy; |
| | |
| | | this.setName(fname); |
| | | this.tid = tid; |
| | | this.createStrategy = createStrategy; |
| | | this.createStrategy.addCreateFeatureTypeEventListener(this); |
| | | } |
| | | |
| | | public int getTid() |
| | |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | public void createFeatureTypeOccurred(FeatureTypeEvent evt) |
| | | { |
| | | fireFeatureTypeEvent(evt); |
| | | } |
| | | } |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | throw new JobExecutionException("Cannot connect source postgreSQL database."); |
| | | } |
| | | |
| | | Calendar cal = Calendar.getInstance(); |
| | | Date startTime = cal.getTime(); |
| | | long t1 = System.currentTimeMillis(); |
| | | try |
| | | { |
| | | logger.info("-- step:clearOutputDatabase --"); |
| | |
| | | } |
| | | |
| | | disconnect(); |
| | | Date endTime = cal.getTime(); |
| | | Date time = new Date(endTime.getTime() - startTime.getTime()); |
| | | long t2 = System.currentTimeMillis(); |
| | | // public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; |
| | | // SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); |
| | | logger.warn("use time = " + time); |
| | | logger.warn("use time = " + ((t2 - t1) / 60000.0) + " min"); |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | private static final String USEWKB = "USEWKB"; |
| | | |
| | | private static final int FETCHSIZE = 30; |
| | | private static final int BATCHSIZE = 25; |
| | | private static final int COMMITSIZE = 20; |
| | | |
| | | class Pair |
| | |
| | | throw new JobExecutionException("Cannot connect source postgreSQL database."); |
| | | } |
| | | |
| | | Calendar cal = Calendar.getInstance(); |
| | | Date startTime = cal.getTime(); |
| | | long t1 = System.currentTimeMillis(); |
| | | try |
| | | { |
| | | logger.info("-- step:clearOutputDatabase --"); |
| | |
| | | } |
| | | |
| | | disconnect(); |
| | | Date endTime = cal.getTime(); |
| | | Date time = new Date(endTime.getTime() - startTime.getTime()); |
| | | long t2 = System.currentTimeMillis(); |
| | | // public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; |
| | | // SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); |
| | | logger.warn("use time = " + time); |
| | | logger.warn("use time = " + ((int) ((t2 - t1) / 60000.0)) + " min - " + |
| | | (((int) ((t2 - t1) % 60000.0)) / 1000) + " sec"); |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | |
| | | logger.debug("--- start dgnfile-" + dgnFile.toString() + " ---"); |
| | | try |
| | | { |
| | | convertContext.clearOutputDatabase(); |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | |
| | | if (!pgProperties.containsKey(PostgisDataStoreFactory.MAXCONN.key)) |
| | | { |
| | | pgProperties.put(PostgisDataStoreFactory.MAXCONN.key, "2"); |
| | | pgProperties.put(PostgisDataStoreFactory.MAXCONN.key, "10"); |
| | | } |
| | | |
| | | if (!pgProperties.containsKey(PostgisDataStoreFactory.MINCONN.key)) |
| | |
| | | throw new JobExecutionException(e.getMessage(), e); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | convertContext.setExecutionContext(context); |
| | | String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); |
| | | convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); |
| | | convertContext.startTransaction(); |
| | | |
| | | FileInputStream fs = new FileInputStream(dgnFile); |
| | | FileChannel fc = fs.getChannel(); |
| | |
| | | package com.ximple.eofms.jobs.context.postgis; |
| | | |
| | | import java.io.IOException; |
| | | import java.math.BigDecimal; |
| | | import java.sql.Connection; |
| | | import java.sql.DatabaseMetaData; |
| | | import java.sql.ResultSet; |
| | | import java.sql.SQLException; |
| | | import java.sql.Statement; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | |
| | | import org.geotools.data.DataSourceException; |
| | | import org.geotools.data.DataStore; |
| | | import org.geotools.data.Transaction; |
| | | import org.geotools.data.SchemaNotFoundException; |
| | | import org.geotools.data.Transaction; |
| | | import org.geotools.data.jdbc.JDBCUtils; |
| | | import org.geotools.data.postgis.PostgisDataStore; |
| | | import org.geotools.feature.AttributeType; |
| | | import org.geotools.feature.Feature; |
| | | import org.geotools.feature.FeatureType; |
| | | import org.geotools.feature.GeometryAttributeType; |
| | | import org.geotools.filter.LengthFunction; |
| | | import org.geotools.referencing.NamedIdentifier; |
| | | import org.geotools.referencing.crs.DefaultGeographicCRS; |
| | | import org.opengis.filter.BinaryComparisonOperator; |
| | | import org.opengis.filter.Filter; |
| | | import org.opengis.filter.PropertyIsLessThan; |
| | | import org.opengis.filter.PropertyIsLessThanOrEqualTo; |
| | | import org.opengis.filter.expression.Literal; |
| | | import org.opengis.referencing.crs.CoordinateReferenceSystem; |
| | | |
| | | import com.vividsolutions.jts.geom.Geometry; |
| | | import com.vividsolutions.jts.geom.GeometryCollection; |
| | | import com.vividsolutions.jts.geom.LineString; |
| | | import com.vividsolutions.jts.geom.MultiLineString; |
| | | import com.vividsolutions.jts.geom.MultiPoint; |
| | | import com.vividsolutions.jts.geom.MultiPolygon; |
| | | import com.vividsolutions.jts.geom.Point; |
| | | import com.vividsolutions.jts.geom.Polygon; |
| | | import com.vividsolutions.jts.io.WKBWriter; |
| | | import com.vividsolutions.jts.io.WKTWriter; |
| | | |
| | | import com.ximple.eofms.jobs.context.AbstractDgnFileJobContext; |
| | | |
| | | public abstract class AbstractDgnToPostGISJobContext extends AbstractDgnFileJobContext |
| | | { |
| | | private static Map<String, Class> GEOM_TYPE_MAP = new HashMap<String, Class>(); |
| | | |
| | | static |
| | | { |
| | | GEOM_TYPE_MAP.put("GEOMETRY", Geometry.class); |
| | | GEOM_TYPE_MAP.put("POINT", Point.class); |
| | | GEOM_TYPE_MAP.put("POINTM", Point.class); |
| | | GEOM_TYPE_MAP.put("LINESTRING", LineString.class); |
| | | GEOM_TYPE_MAP.put("LINESTRINGM", LineString.class); |
| | | GEOM_TYPE_MAP.put("POLYGON", Polygon.class); |
| | | GEOM_TYPE_MAP.put("POLYGONM", Polygon.class); |
| | | GEOM_TYPE_MAP.put("MULTIPOINT", MultiPoint.class); |
| | | GEOM_TYPE_MAP.put("MULTIPOINTM", MultiPoint.class); |
| | | GEOM_TYPE_MAP.put("MULTILINESTRING", MultiLineString.class); |
| | | GEOM_TYPE_MAP.put("MULTILINESTRINGM", MultiLineString.class); |
| | | GEOM_TYPE_MAP.put("MULTIPOLYGON", MultiPolygon.class); |
| | | GEOM_TYPE_MAP.put("MULTIPOLYGONM", MultiPolygon.class); |
| | | GEOM_TYPE_MAP.put("GEOMETRYCOLLECTION", GeometryCollection.class); |
| | | GEOM_TYPE_MAP.put("GEOMETRYCOLLECTIONM", GeometryCollection.class); |
| | | } |
| | | |
| | | private static Map<Class, String> CLASS_MAPPINGS = new HashMap<Class, String>(); |
| | | |
| | | static |
| | | { |
| | | CLASS_MAPPINGS.put(String.class, "VARCHAR"); |
| | | |
| | | CLASS_MAPPINGS.put(Boolean.class, "BOOLEAN"); |
| | | |
| | | CLASS_MAPPINGS.put(Short.class, "SMALLINT"); |
| | | CLASS_MAPPINGS.put(Integer.class, "INTEGER"); |
| | | CLASS_MAPPINGS.put(Long.class, "BIGINT"); |
| | | |
| | | CLASS_MAPPINGS.put(Float.class, "REAL"); |
| | | CLASS_MAPPINGS.put(Double.class, "DOUBLE PRECISION"); |
| | | |
| | | CLASS_MAPPINGS.put(BigDecimal.class, "DECIMAL"); |
| | | |
| | | CLASS_MAPPINGS.put(java.sql.Date.class, "DATE"); |
| | | CLASS_MAPPINGS.put(java.util.Date.class, "DATE"); |
| | | CLASS_MAPPINGS.put(java.sql.Time.class, "TIME"); |
| | | CLASS_MAPPINGS.put(java.sql.Timestamp.class, "TIMESTAMP"); |
| | | } |
| | | |
| | | private static Map<Class, String> GEOM_CLASS_MAPPINGS = new HashMap<Class, String>(); |
| | | |
| | | //why don't we just stick this in with the non-geom class mappings? |
| | | static |
| | | { |
| | | // init the inverse map |
| | | Set keys = GEOM_TYPE_MAP.keySet(); |
| | | |
| | | for (Object key : keys) |
| | | { |
| | | String name = (String) key; |
| | | Class geomClass = GEOM_TYPE_MAP.get(name); |
| | | GEOM_CLASS_MAPPINGS.put(geomClass, name); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Maximum string size for postgres |
| | | */ |
| | | private static final int MAX_ALLOWED_VALUE = 10485760; |
| | | |
| | | protected static final int BATCHSIZE = 25; |
| | | |
| | | /** |
| | | * Well Known Text writer (from JTS). |
| | | */ |
| | | protected static WKTWriter geometryWriter = new WKTWriter(); |
| | | |
| | | protected PostgisDataStore targetDataStore; |
| | | private Connection connection; |
| | | protected boolean schemaEnabled = true; |
| | | |
| | | public AbstractDgnToPostGISJobContext(String dataPath, DataStore targetDataStore) |
| | | { |
| | | super(dataPath); |
| | | this.targetDataStore = (PostgisDataStore) targetDataStore; |
| | | this.connection = null; |
| | | } |
| | | |
| | | public PostgisDataStore getTargetDataStore() |
| | |
| | | |
| | | public Connection getConnection() |
| | | { |
| | | if (connection != null) return connection; |
| | | |
| | | if (targetDataStore != null) |
| | | { |
| | | try |
| | | { |
| | | return targetDataStore.getConnection(Transaction.AUTO_COMMIT); |
| | | } catch (IOException e) |
| | | connection = targetDataStore.getDataSource().getConnection(); |
| | | } catch (SQLException e) |
| | | { |
| | | getLogger().warn(e.getMessage(), e); |
| | | return null; |
| | | } |
| | | } |
| | | return null; |
| | | return connection; |
| | | } |
| | | |
| | | public void closeConnection() |
| | | { |
| | | if (connection == null) |
| | | { |
| | | JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null); |
| | | connection = null; |
| | | } |
| | | } |
| | | |
| | | protected boolean isExistFeature(FeatureType featureType) |
| | | { |
| | | try |
| | | { |
| | | FeatureType existFeatureType = targetDataStore.getSchema(featureType.getTypeName()); |
| | | return existFeatureType != null && existFeatureType.equals(featureType); |
| | | return existFeatureType != null; // && existFeatureType.equals(featureType); |
| | | } catch (SchemaNotFoundException e) |
| | | { |
| | | return false; |
| | |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | protected void deleteTable(Connection conn, String tableName) throws SQLException |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append("DELETE FROM \""); |
| | | sb.append(targetDataStore.getDatabaseSchemaName()); |
| | | sb.append("\".\""); |
| | | sb.append(tableName); |
| | | sb.append('\"'); |
| | | getLogger().info("Execute-" + sb.toString()); |
| | | stmt.execute(sb.toString()); |
| | | stmt.close(); |
| | | conn.commit(); |
| | | } |
| | | |
| | | protected void dropTable(Connection conn, String tableName) throws SQLException |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append("DROP TABLE \""); |
| | | sb.append(targetDataStore.getDatabaseSchemaName()); |
| | | sb.append("\".\""); |
| | | sb.append(tableName); |
| | | sb.append("\" CASCADE"); |
| | | getLogger().info("Execute-" + sb.toString()); |
| | | stmt.execute(sb.toString()); |
| | | stmt.close(); |
| | | conn.commit(); |
| | | } |
| | | |
| | | protected void dropGeometryColumn(Connection conn, String tableName, String geomField) throws SQLException |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append("SELECT DropGeometryColumn('','"); |
| | | sb.append(tableName); |
| | | sb.append("','"); |
| | | sb.append(geomField); |
| | | sb.append("')"); |
| | | getLogger().info("Execute-" + sb.toString()); |
| | | stmt.execute(sb.toString()); |
| | | stmt.close(); |
| | | conn.commit(); |
| | | } |
| | | |
| | | public ArrayList<String> createSchemaTexts(FeatureType featureType) throws IOException |
| | | { |
| | | String tableName = featureType.getTypeName(); |
| | | |
| | | // String lcTableName = tableName.toLowerCase(); |
| | | ArrayList<String> result = new ArrayList<String>(); |
| | | |
| | | AttributeType[] attributeType = featureType.getAttributeTypes(); |
| | | String dbSchema = targetDataStore.getDatabaseSchemaName(); |
| | | |
| | | Connection con = getConnection(); |
| | | |
| | | boolean shouldExecute = !tablePresent(tableName, con); |
| | | |
| | | try |
| | | { |
| | | StringBuffer sql = new StringBuffer("CREATE TABLE "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" ("); |
| | | sql.append(makeSqlCreate(attributeType)); |
| | | sql.append(");"); |
| | | |
| | | String sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | |
| | | //fix from pr: it may be that table existed and then was dropped |
| | | //without removing its geometry info from GEOMETRY_COLUMNS. |
| | | //To support this, try to delete before inserting. |
| | | //Preserving case for table names gives problems, |
| | | //so convert to lower case |
| | | |
| | | sql = new StringBuffer("DELETE FROM GEOMETRY_COLUMNS WHERE f_table_catalog=''"); |
| | | sql.append(" AND f_table_schema = '"); |
| | | sql.append(dbSchema); |
| | | sql.append("'"); |
| | | sql.append("AND f_table_name = '"); |
| | | sql.append(tableName); |
| | | sql.append("';"); |
| | | |
| | | //prints statement for later reuse |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | |
| | | //Ok, so Paolo Rizzi suggested that we get rid of our hand-adding |
| | | //of geometry column information and use AddGeometryColumn instead |
| | | //as it is better (this is in GEOT-379, he attached an extended |
| | | //datastore that does postgis fixes). But I am pretty positive |
| | | //the reason we are doing things this way is to preserve the order |
| | | //of FeatureTypes. I know this is fairly silly, from most |
| | | //information perspectives, but from another perspective it seems |
| | | //to make sense - if you were transfering a featureType from one |
| | | //data store to another then it should have the same order, right? |
| | | //And order is important in WFS. There are a few caveats though |
| | | //for one I don't even know if things work right. I imagine the |
| | | //proper constraints that a AddGeometryColumn operation does are |
| | | //not set in our hand version, for one. I would feel better about |
| | | //ignoring the order and just doing things as we like if we had |
| | | //views in place, if users could add the schema, and then be able |
| | | //to get it back in exactly the order they wanted. So for now |
| | | //let's leave things as is, and maybe talk about it in an irc. -ch |
| | | for (AttributeType anAttributeType : attributeType) |
| | | { |
| | | if (!(anAttributeType instanceof GeometryAttributeType)) |
| | | { |
| | | continue; |
| | | } |
| | | GeometryAttributeType geomAttribute = (GeometryAttributeType) anAttributeType; |
| | | String columnName = anAttributeType.getLocalName(); |
| | | |
| | | CoordinateReferenceSystem refSys = geomAttribute |
| | | .getCoordinateSystem(); |
| | | int SRID; |
| | | |
| | | if (refSys != null) |
| | | { |
| | | try |
| | | { |
| | | Set ident = refSys.getIdentifiers(); |
| | | if ((ident == null || ident.isEmpty()) && refSys == DefaultGeographicCRS.WGS84) |
| | | { |
| | | SRID = 4326; |
| | | } else |
| | | { |
| | | String code = ((NamedIdentifier) ident.toArray()[0]).getCode(); |
| | | SRID = Integer.parseInt(code); |
| | | } |
| | | } catch (Exception e) |
| | | { |
| | | getLogger().warn("SRID could not be determined"); |
| | | SRID = -1; |
| | | } |
| | | } else |
| | | { |
| | | SRID = -1; |
| | | } |
| | | |
| | | String typeName; |
| | | |
| | | //this construct seems unnecessary, since we already would |
| | | //pass over if this wasn't a geometry... |
| | | Class type = geomAttribute.getType(); |
| | | |
| | | if (geomAttribute instanceof GeometryAttributeType) |
| | | { |
| | | typeName = getGeometrySQLTypeName(type); |
| | | } else |
| | | { |
| | | typeName = CLASS_MAPPINGS.get(type); |
| | | } |
| | | |
| | | if (typeName != null) |
| | | { |
| | | //add a row to the geometry_columns table |
| | | sql = new StringBuffer("INSERT INTO GEOMETRY_COLUMNS VALUES ("); |
| | | sql.append("'','"); |
| | | sql.append(dbSchema); |
| | | sql.append("','"); |
| | | sql.append(tableName); |
| | | sql.append("','"); |
| | | sql.append(columnName); |
| | | sql.append("',2,"); |
| | | sql.append(SRID); |
| | | sql.append(",'"); |
| | | sql.append(typeName); |
| | | sql.append("');"); |
| | | |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | |
| | | //add geometry constaints to the table |
| | | if (SRID > -1) |
| | | { |
| | | sql = new StringBuffer("ALTER TABLE "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" ADD CONSTRAINT enforce_srid_"); |
| | | sql.append(columnName); |
| | | sql.append(" CHECK (SRID("); |
| | | sql.append(encodeSchemaColumnName(columnName)); |
| | | sql.append(") = "); |
| | | sql.append(SRID); |
| | | sql.append(");"); |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | } |
| | | |
| | | sql = new StringBuffer("ALTER TABLE "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" ADD CONSTRAINT enforce_dims_"); |
| | | sql.append(columnName); |
| | | sql.append(" CHECK (ndims("); |
| | | sql.append(encodeSchemaColumnName(columnName)); |
| | | sql.append(") = 2);"); |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | |
| | | if (!typeName.equals("GEOMETRY")) |
| | | { |
| | | sql = new StringBuffer("ALTER TABLE "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" ADD CONSTRAINT enforce_geotype_"); |
| | | sql.append(columnName); |
| | | sql.append(" CHECK (geometrytype("); |
| | | sql.append(encodeSchemaColumnName(columnName)); |
| | | sql.append(") = '"); |
| | | sql.append(typeName); |
| | | sql.append("'::text OR "); |
| | | sql.append(encodeSchemaColumnName(columnName)); |
| | | sql.append(" IS NULL);"); |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | } |
| | | |
| | | } else |
| | | { |
| | | getLogger().warn("Error: " + geomAttribute.getLocalName() + " unknown type!!!"); |
| | | } |
| | | |
| | | //also build a spatial index on each geometry column. |
| | | sql = new StringBuffer("CREATE INDEX spatial_"); |
| | | sql.append(tableName); |
| | | sql.append("_"); |
| | | sql.append(anAttributeType.getLocalName().toLowerCase()); |
| | | sql.append(" ON "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" USING GIST ("); |
| | | sql.append(encodeSchemaColumnName(anAttributeType.getLocalName())); |
| | | sql.append(");"); |
| | | |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | } |
| | | |
| | | con.commit(); |
| | | |
| | | } catch (SQLException e) |
| | | { |
| | | try |
| | | { |
| | | if (con != null) |
| | | { |
| | | con.rollback(); |
| | | } |
| | | } catch (SQLException sqle) |
| | | { |
| | | throw new IOException(sqle.getMessage()); |
| | | } |
| | | |
| | | throw (IOException) new IOException(e.getMessage()).initCause(e); |
| | | } finally |
| | | { |
| | | } |
| | | |
| | | if (!shouldExecute) |
| | | { |
| | | throw new IOException("The table " + tableName + " already exists."); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | private boolean tablePresent(String table, Connection conn) throws IOException |
| | | { |
| | | final int TABLE_NAME_COL = 3; |
| | | |
| | | try |
| | | { |
| | | conn = getConnection(); |
| | | |
| | | DatabaseMetaData meta = conn.getMetaData(); |
| | | String[] tableType = {"TABLE"}; |
| | | ResultSet tables = meta.getTables(null, |
| | | targetDataStore.getDatabaseSchemaName(), "%", tableType); |
| | | |
| | | while (tables.next()) |
| | | { |
| | | String tableName = tables.getString(TABLE_NAME_COL); |
| | | |
| | | if (allowTable(tableName) && (tableName != null) |
| | | && (tableName.equalsIgnoreCase(table))) |
| | | { |
| | | return (true); |
| | | } |
| | | } |
| | | |
| | | return false; |
| | | } catch (SQLException sqlException) |
| | | { |
| | | // JDBCUtils.close(conn, Transaction.AUTO_COMMIT, sqlException); |
| | | // conn = null; |
| | | |
| | | String message = "Error querying database for list of tables:" |
| | | + sqlException.getMessage(); |
| | | throw new DataSourceException(message, sqlException); |
| | | } finally |
| | | { |
| | | // JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); |
| | | } |
| | | } |
| | | |
| | | protected boolean allowTable(String tablename) |
| | | { |
| | | if (tablename.equals("geometry_columns")) |
| | | { |
| | | return false; |
| | | } else if (tablename.startsWith("spatial_ref_sys")) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | //others? |
| | | return true; |
| | | } |
| | | |
| | | |
| | | private StringBuffer makeSqlCreate(AttributeType[] attributeType) |
| | | throws IOException |
| | | { |
| | | StringBuffer buf = new StringBuffer(""); |
| | | |
| | | for (AttributeType anAttributeType : attributeType) |
| | | { |
| | | String typeName; |
| | | typeName = CLASS_MAPPINGS.get(anAttributeType.getBinding()); |
| | | if (typeName == null) |
| | | typeName = GEOM_CLASS_MAPPINGS.get(anAttributeType.getBinding()); |
| | | |
| | | if (typeName != null) |
| | | { |
| | | if (anAttributeType instanceof GeometryAttributeType) |
| | | { |
| | | typeName = "GEOMETRY"; |
| | | } else if (typeName.equals("VARCHAR")) |
| | | { |
| | | int length = -1; |
| | | Filter f = anAttributeType.getRestriction(); |
| | | if (f != null && f != Filter.EXCLUDE && f != Filter.INCLUDE && |
| | | (f instanceof PropertyIsLessThan || f instanceof PropertyIsLessThanOrEqualTo)) |
| | | { |
| | | try |
| | | { |
| | | BinaryComparisonOperator cf = (BinaryComparisonOperator) f; |
| | | if (cf.getExpression1() instanceof LengthFunction) |
| | | { |
| | | length = Integer.parseInt(((Literal) cf.getExpression2()).getValue().toString()); |
| | | } else |
| | | { |
| | | if (cf.getExpression2() instanceof LengthFunction) |
| | | { |
| | | length = Integer.parseInt(((Literal) cf.getExpression1()).getValue().toString()); |
| | | } |
| | | } |
| | | } catch (NumberFormatException e) |
| | | { |
| | | length = 256; |
| | | } |
| | | } else |
| | | { |
| | | length = 256; |
| | | } |
| | | |
| | | if (length < 1) |
| | | { |
| | | getLogger().warn("FeatureType did not specify string length; defaulted to 256"); |
| | | length = 256; |
| | | } else if (length > MAX_ALLOWED_VALUE) |
| | | { |
| | | length = MAX_ALLOWED_VALUE; |
| | | } |
| | | typeName = typeName + "(" + length + ")"; |
| | | } |
| | | |
| | | if (!anAttributeType.isNillable()) |
| | | { |
| | | typeName = typeName + " NOT NULL"; |
| | | } |
| | | |
| | | //TODO review!!! Is toString() always OK??? |
| | | Object defaultValue = anAttributeType.createDefaultValue(); |
| | | |
| | | if (defaultValue != null) |
| | | { |
| | | typeName = typeName + " DEFAULT '" |
| | | + defaultValue.toString() + "'"; |
| | | } |
| | | |
| | | buf.append(" \"").append(anAttributeType.getLocalName()).append("\" ").append(typeName).append(","); |
| | | |
| | | } else |
| | | { |
| | | String msg; |
| | | if (anAttributeType == null) |
| | | { |
| | | msg = "AttributeType was null!"; |
| | | } else |
| | | { |
| | | msg = "Type '" + anAttributeType.getBinding() + "' not supported!"; |
| | | } |
| | | throw (new IOException(msg)); |
| | | } |
| | | } |
| | | |
| | | return buf.deleteCharAt(buf.length() - 1); |
| | | } |
| | | |
| | | private String getGeometrySQLTypeName(Class type) |
| | | { |
| | | String res = GEOM_CLASS_MAPPINGS.get(type); |
| | | |
| | | if (res == null) |
| | | { |
| | | throw new RuntimeException("Unknown type name for class " + type |
| | | + " please update GEOMETRY_MAPPINGS"); |
| | | } |
| | | |
| | | return res; |
| | | } |
| | | |
| | | protected String getGeometryInsertText(Geometry geom, int srid) // throws IOException |
| | | { |
| | | if (geom == null) |
| | | { |
| | | return "null"; |
| | | } |
| | | |
| | | if (targetDataStore.isWKBEnabled()) |
| | | { |
| | | //String wkb = WKBEncoder.encodeGeometryHex(geom); |
| | | String wkb = WKBWriter.bytesToHex(new WKBWriter().write(geom)); |
| | | |
| | | if (targetDataStore.isByteaWKB()) |
| | | { |
| | | return "setSRID('" + wkb + "'::geometry," + srid + ")"; |
| | | } else |
| | | { |
| | | return "GeomFromWKB('" + wkb + "', " + srid + ")"; |
| | | } |
| | | } |
| | | |
| | | String geoText = geometryWriter.write(geom); |
| | | |
| | | return "GeometryFromText('" + geoText + "', " + srid + ")"; |
| | | } |
| | | |
| | | protected String makeInsertSql(Feature feature, int srid) // throws IOException |
| | | { |
| | | FeatureType featureType = feature.getFeatureType(); |
| | | |
| | | String tableName = encodeSchemaTableName(featureType.getTypeName()); |
| | | AttributeType[] attributeTypes = featureType.getAttributeTypes(); |
| | | |
| | | String attrValue; |
| | | |
| | | StringBuffer statementSQL = new StringBuffer("INSERT INTO " + tableName + " ("); |
| | | |
| | | // encode insertion for attributes, but remember to avoid auto-increment ones, |
| | | // they may be included in the feature type as well |
| | | for (AttributeType attributeType : attributeTypes) |
| | | { |
| | | String attName = attributeType.getLocalName(); |
| | | |
| | | if (feature.getAttribute(attName) != null) |
| | | { |
| | | String colName = encodeSchemaColumnName(attName); |
| | | statementSQL.append(colName).append(","); |
| | | } |
| | | } |
| | | |
| | | statementSQL.setCharAt(statementSQL.length() - 1, ')'); |
| | | statementSQL.append(" VALUES ("); |
| | | |
| | | Object[] attributes = feature.getAttributes(null); |
| | | |
| | | for (int i = 0; i < attributeTypes.length; i++) |
| | | { |
| | | attrValue = null; |
| | | |
| | | if (attributeTypes[i] instanceof GeometryAttributeType) |
| | | { |
| | | // String geomName = attributeTypes[i].getLocalName(); |
| | | // int srid = ftInfo.getSRID(geomName); |
| | | Geometry geometry = (Geometry) attributes[i]; |
| | | |
| | | if (geometry == null) |
| | | { |
| | | attrValue = "NULL"; |
| | | } else |
| | | { |
| | | attrValue = getGeometryInsertText(geometry, srid); |
| | | } |
| | | } else |
| | | { |
| | | if (attributes[i] != null) |
| | | { |
| | | attrValue = addQuotes(attributes[i]); |
| | | } |
| | | } |
| | | |
| | | if (attrValue != null) |
| | | { |
| | | statementSQL.append(attrValue).append(","); |
| | | } |
| | | } |
| | | |
| | | statementSQL.setCharAt(statementSQL.length() - 1, ')'); |
| | | |
| | | return (statementSQL.toString()); |
| | | } |
| | | |
| | | protected String addQuotes(Object value) |
| | | { |
| | | String retString; |
| | | |
| | | if (value != null) |
| | | { |
| | | if (value instanceof Number) |
| | | { |
| | | retString = value.toString(); |
| | | } else |
| | | { |
| | | retString = "'" + doubleQuote(value) + "'"; |
| | | } |
| | | } else |
| | | { |
| | | retString = "null"; |
| | | } |
| | | |
| | | return retString; |
| | | } |
| | | |
| | | String doubleQuote(Object obj) |
| | | { |
| | | return obj.toString().replaceAll("'", "''"); |
| | | } |
| | | |
| | | protected String encodeName(String tableName) |
| | | { |
| | | return tableName; |
| | | } |
| | | |
| | | protected String encodeColumnName(String colName) |
| | | { |
| | | return encodeName(colName); |
| | | } |
| | | |
| | | public String encodeSchemaTableName(String tableName) { |
| | | return schemaEnabled ? ("\"" + targetDataStore.getDatabaseSchemaName() + "\".\"" + tableName + "\"") |
| | | : ("\"" + tableName + "\""); |
| | | } |
| | | |
| | | public String encodeSchemaColumnName(String columnName) { |
| | | return "\"" + columnName + "\""; |
| | | } |
| | | } |
| | |
| | | |
| | | import java.io.IOException; |
| | | import java.sql.Connection; |
| | | import java.sql.SQLException; |
| | | import java.sql.Statement; |
| | | import java.sql.DatabaseMetaData; |
| | | import java.sql.ResultSet; |
| | | import java.util.Map; |
| | | import java.util.HashMap; |
| | | import java.util.Set; |
| | | import java.util.ArrayList; |
| | | import java.math.BigDecimal; |
| | | |
| | | import org.geotools.data.DataStore; |
| | | import org.geotools.data.Transaction; |
| | | import org.geotools.data.SchemaNotFoundException; |
| | | import org.geotools.data.DataSourceException; |
| | | import org.geotools.data.jdbc.JDBCUtils; |
| | | import org.geotools.data.postgis.PostgisDataStore; |
| | | import org.geotools.feature.FeatureType; |
| | | import org.geotools.feature.AttributeType; |
| | | import org.geotools.feature.GeometryAttributeType; |
| | | import org.geotools.feature.Feature; |
| | | import org.geotools.referencing.crs.DefaultGeographicCRS; |
| | | import org.geotools.referencing.NamedIdentifier; |
| | | import org.geotools.filter.LengthFunction; |
| | | import org.opengis.referencing.crs.CoordinateReferenceSystem; |
| | | import org.opengis.filter.Filter; |
| | | import org.opengis.filter.PropertyIsLessThan; |
| | | import org.opengis.filter.PropertyIsLessThanOrEqualTo; |
| | | import org.opengis.filter.BinaryComparisonOperator; |
| | | import org.opengis.filter.expression.Literal; |
| | | |
| | | import com.vividsolutions.jts.geom.Geometry; |
| | | import com.vividsolutions.jts.geom.Point; |
| | | import com.vividsolutions.jts.geom.LineString; |
| | | import com.vividsolutions.jts.geom.Polygon; |
| | | import com.vividsolutions.jts.geom.MultiPoint; |
| | | import com.vividsolutions.jts.geom.MultiLineString; |
| | | import com.vividsolutions.jts.geom.MultiPolygon; |
| | | import com.vividsolutions.jts.geom.GeometryCollection; |
| | | import com.vividsolutions.jts.io.WKTWriter; |
| | | import com.vividsolutions.jts.io.WKBWriter; |
| | | |
| | | import com.ximple.eofms.jobs.context.AbstractOracleJobContext; |
| | | |
| | | public abstract class AbstractOracleToPostGISJobContext extends AbstractOracleJobContext |
| | | { |
| | | private static Map<String, Class> GEOM_TYPE_MAP = new HashMap<String, Class>(); |
| | | |
| | | static |
| | | { |
| | | GEOM_TYPE_MAP.put("GEOMETRY", Geometry.class); |
| | | GEOM_TYPE_MAP.put("POINT", Point.class); |
| | | GEOM_TYPE_MAP.put("POINTM", Point.class); |
| | | GEOM_TYPE_MAP.put("LINESTRING", LineString.class); |
| | | GEOM_TYPE_MAP.put("LINESTRINGM", LineString.class); |
| | | GEOM_TYPE_MAP.put("POLYGON", Polygon.class); |
| | | GEOM_TYPE_MAP.put("POLYGONM", Polygon.class); |
| | | GEOM_TYPE_MAP.put("MULTIPOINT", MultiPoint.class); |
| | | GEOM_TYPE_MAP.put("MULTIPOINTM", MultiPoint.class); |
| | | GEOM_TYPE_MAP.put("MULTILINESTRING", MultiLineString.class); |
| | | GEOM_TYPE_MAP.put("MULTILINESTRINGM", MultiLineString.class); |
| | | GEOM_TYPE_MAP.put("MULTIPOLYGON", MultiPolygon.class); |
| | | GEOM_TYPE_MAP.put("MULTIPOLYGONM", MultiPolygon.class); |
| | | GEOM_TYPE_MAP.put("GEOMETRYCOLLECTION", GeometryCollection.class); |
| | | GEOM_TYPE_MAP.put("GEOMETRYCOLLECTIONM", GeometryCollection.class); |
| | | } |
| | | |
| | | private static Map<Class, String> CLASS_MAPPINGS = new HashMap<Class, String>(); |
| | | |
| | | static |
| | | { |
| | | CLASS_MAPPINGS.put(String.class, "VARCHAR"); |
| | | |
| | | CLASS_MAPPINGS.put(Boolean.class, "BOOLEAN"); |
| | | |
| | | CLASS_MAPPINGS.put(Short.class, "SMALLINT"); |
| | | CLASS_MAPPINGS.put(Integer.class, "INTEGER"); |
| | | CLASS_MAPPINGS.put(Long.class, "BIGINT"); |
| | | |
| | | CLASS_MAPPINGS.put(Float.class, "REAL"); |
| | | CLASS_MAPPINGS.put(Double.class, "DOUBLE PRECISION"); |
| | | |
| | | CLASS_MAPPINGS.put(BigDecimal.class, "DECIMAL"); |
| | | |
| | | CLASS_MAPPINGS.put(java.sql.Date.class, "DATE"); |
| | | CLASS_MAPPINGS.put(java.util.Date.class, "DATE"); |
| | | CLASS_MAPPINGS.put(java.sql.Time.class, "TIME"); |
| | | CLASS_MAPPINGS.put(java.sql.Timestamp.class, "TIMESTAMP"); |
| | | } |
| | | |
| | | private static Map<Class, String> GEOM_CLASS_MAPPINGS = new HashMap<Class, String>(); |
| | | |
| | | //why don't we just stick this in with the non-geom class mappings? |
| | | static |
| | | { |
| | | // init the inverse map |
| | | Set keys = GEOM_TYPE_MAP.keySet(); |
| | | |
| | | for (Object key : keys) |
| | | { |
| | | String name = (String) key; |
| | | Class geomClass = GEOM_TYPE_MAP.get(name); |
| | | GEOM_CLASS_MAPPINGS.put(geomClass, name); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Maximum string size for postgres |
| | | */ |
| | | private static final int MAX_ALLOWED_VALUE = 10485760; |
| | | |
| | | protected static final int BATCHSIZE = 25; |
| | | |
| | | /** |
| | | * Well Known Text writer (from JTS). |
| | | */ |
| | | protected static WKTWriter geometryWriter = new WKTWriter(); |
| | | |
| | | protected PostgisDataStore targetDataStore; |
| | | |
| | | private Connection connection; |
| | | protected boolean schemaEnabled = true; |
| | | |
| | | public AbstractOracleToPostGISJobContext(String dataPath, DataStore targetDataStore) |
| | | { |
| | |
| | | |
| | | public Connection getConnection() |
| | | { |
| | | if (connection != null) return connection; |
| | | |
| | | if (targetDataStore != null) |
| | | { |
| | | try |
| | | { |
| | | return targetDataStore.getConnection(Transaction.AUTO_COMMIT); |
| | | } catch (IOException e) |
| | | connection = targetDataStore.getDataSource().getConnection(); |
| | | } catch (SQLException e) |
| | | { |
| | | getLogger().warn(e.getMessage(), e); |
| | | return null; |
| | | } |
| | | } |
| | | return null; |
| | | return connection; |
| | | } |
| | | |
| | | public void closeConnection() |
| | | { |
| | | if (connection == null) |
| | | { |
| | | JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null); |
| | | connection = null; |
| | | } |
| | | } |
| | | |
| | | protected boolean isExistFeature(FeatureType featureType) |
| | | { |
| | | try |
| | | { |
| | | FeatureType existFeatureType = targetDataStore.getSchema(featureType.getTypeName()); |
| | | return existFeatureType != null && existFeatureType.equals(featureType); |
| | | return existFeatureType != null; // && existFeatureType.equals(featureType); |
| | | } catch (SchemaNotFoundException e) |
| | | { |
| | | return false; |
| | |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | protected void deleteTable(Connection conn, String tableName) throws SQLException |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append("DELETE FROM \""); |
| | | sb.append(targetDataStore.getDatabaseSchemaName()); |
| | | sb.append("\".\""); |
| | | sb.append(tableName); |
| | | sb.append('\"'); |
| | | getLogger().info("Execute-" + sb.toString()); |
| | | stmt.execute(sb.toString()); |
| | | stmt.close(); |
| | | conn.commit(); |
| | | } |
| | | |
| | | protected void dropTable(Connection conn, String tableName) throws SQLException |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append("DROP TABLE \""); |
| | | sb.append(targetDataStore.getDatabaseSchemaName()); |
| | | sb.append("\".\""); |
| | | sb.append(tableName); |
| | | sb.append("\" CASCADE"); |
| | | getLogger().info("Execute-" + sb.toString()); |
| | | stmt.execute(sb.toString()); |
| | | stmt.close(); |
| | | conn.commit(); |
| | | } |
| | | |
| | | protected void dropGeometryColumn(Connection conn, String tableName, String geomField) throws SQLException |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append("SELECT DropGeometryColumn('','"); |
| | | sb.append(tableName); |
| | | sb.append("','"); |
| | | sb.append(geomField); |
| | | sb.append("')"); |
| | | getLogger().info("Execute-" + sb.toString()); |
| | | stmt.execute(sb.toString()); |
| | | stmt.close(); |
| | | conn.commit(); |
| | | } |
| | | |
| | | public ArrayList<String> createSchemaTexts(FeatureType featureType) throws IOException |
| | | { |
| | | String tableName = featureType.getTypeName(); |
| | | |
| | | // String lcTableName = tableName.toLowerCase(); |
| | | ArrayList<String> result = new ArrayList<String>(); |
| | | |
| | | AttributeType[] attributeType = featureType.getAttributeTypes(); |
| | | String dbSchema = targetDataStore.getDatabaseSchemaName(); |
| | | |
| | | Connection con = getConnection(); |
| | | |
| | | boolean shouldExecute = !tablePresent(tableName, con); |
| | | |
| | | try |
| | | { |
| | | StringBuffer sql = new StringBuffer("CREATE TABLE "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" ("); |
| | | sql.append(makeSqlCreate(attributeType)); |
| | | sql.append(");"); |
| | | |
| | | String sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | |
| | | //fix from pr: it may be that table existed and then was dropped |
| | | //without removing its geometry info from GEOMETRY_COLUMNS. |
| | | //To support this, try to delete before inserting. |
| | | //Preserving case for table names gives problems, |
| | | //so convert to lower case |
| | | |
| | | sql = new StringBuffer("DELETE FROM GEOMETRY_COLUMNS WHERE f_table_catalog=''"); |
| | | sql.append(" AND f_table_schema = '"); |
| | | sql.append(dbSchema); |
| | | sql.append("'"); |
| | | sql.append("AND f_table_name = '"); |
| | | sql.append(tableName); |
| | | sql.append("';"); |
| | | |
| | | //prints statement for later reuse |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | |
| | | //Ok, so Paolo Rizzi suggested that we get rid of our hand-adding |
| | | //of geometry column information and use AddGeometryColumn instead |
| | | //as it is better (this is in GEOT-379, he attached an extended |
| | | //datastore that does postgis fixes). But I am pretty positive |
| | | //the reason we are doing things this way is to preserve the order |
| | | //of FeatureTypes. I know this is fairly silly, from most |
| | | //information perspectives, but from another perspective it seems |
| | | //to make sense - if you were transfering a featureType from one |
| | | //data store to another then it should have the same order, right? |
| | | //And order is important in WFS. There are a few caveats though |
| | | //for one I don't even know if things work right. I imagine the |
| | | //proper constraints that a AddGeometryColumn operation does are |
| | | //not set in our hand version, for one. I would feel better about |
| | | //ignoring the order and just doing things as we like if we had |
| | | //views in place, if users could add the schema, and then be able |
| | | //to get it back in exactly the order they wanted. So for now |
| | | //let's leave things as is, and maybe talk about it in an irc. -ch |
| | | for (AttributeType anAttributeType : attributeType) |
| | | { |
| | | if (!(anAttributeType instanceof GeometryAttributeType)) |
| | | { |
| | | continue; |
| | | } |
| | | GeometryAttributeType geomAttribute = (GeometryAttributeType) anAttributeType; |
| | | String columnName = anAttributeType.getLocalName(); |
| | | |
| | | CoordinateReferenceSystem refSys = geomAttribute |
| | | .getCoordinateSystem(); |
| | | int SRID; |
| | | |
| | | if (refSys != null) |
| | | { |
| | | try |
| | | { |
| | | Set ident = refSys.getIdentifiers(); |
| | | if ((ident == null || ident.isEmpty()) && refSys == DefaultGeographicCRS.WGS84) |
| | | { |
| | | SRID = 4326; |
| | | } else |
| | | { |
| | | String code = ((NamedIdentifier) ident.toArray()[0]).getCode(); |
| | | SRID = Integer.parseInt(code); |
| | | } |
| | | } catch (Exception e) |
| | | { |
| | | getLogger().warn("SRID could not be determined"); |
| | | SRID = -1; |
| | | } |
| | | } else |
| | | { |
| | | SRID = -1; |
| | | } |
| | | |
| | | String typeName; |
| | | |
| | | //this construct seems unnecessary, since we already would |
| | | //pass over if this wasn't a geometry... |
| | | Class type = geomAttribute.getType(); |
| | | |
| | | if (geomAttribute instanceof GeometryAttributeType) |
| | | { |
| | | typeName = getGeometrySQLTypeName(type); |
| | | } else |
| | | { |
| | | typeName = CLASS_MAPPINGS.get(type); |
| | | } |
| | | |
| | | if (typeName != null) |
| | | { |
| | | //add a row to the geometry_columns table |
| | | sql = new StringBuffer("INSERT INTO GEOMETRY_COLUMNS VALUES ("); |
| | | sql.append("'','"); |
| | | sql.append(dbSchema); |
| | | sql.append("','"); |
| | | sql.append(tableName); |
| | | sql.append("','"); |
| | | sql.append(columnName); |
| | | sql.append("',2,"); |
| | | sql.append(SRID); |
| | | sql.append(",'"); |
| | | sql.append(typeName); |
| | | sql.append("');"); |
| | | |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | |
| | | //add geometry constaints to the table |
| | | if (SRID > -1) |
| | | { |
| | | sql = new StringBuffer("ALTER TABLE "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" ADD CONSTRAINT enforce_srid_"); |
| | | sql.append(columnName); |
| | | sql.append(" CHECK (SRID("); |
| | | sql.append(encodeSchemaColumnName(columnName)); |
| | | sql.append(") = "); |
| | | sql.append(SRID); |
| | | sql.append(");"); |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | } |
| | | |
| | | sql = new StringBuffer("ALTER TABLE "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" ADD CONSTRAINT enforce_dims_"); |
| | | sql.append(columnName); |
| | | sql.append(" CHECK (ndims("); |
| | | sql.append(encodeSchemaColumnName(columnName)); |
| | | sql.append(") = 2);"); |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | |
| | | if (!typeName.equals("GEOMETRY")) |
| | | { |
| | | sql = new StringBuffer("ALTER TABLE "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" ADD CONSTRAINT enforce_geotype_"); |
| | | sql.append(columnName); |
| | | sql.append(" CHECK (geometrytype("); |
| | | sql.append(encodeSchemaColumnName(columnName)); |
| | | sql.append(") = '"); |
| | | sql.append(typeName); |
| | | sql.append("'::text OR "); |
| | | sql.append(encodeSchemaColumnName(columnName)); |
| | | sql.append(" IS NULL);"); |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | } |
| | | |
| | | } else |
| | | { |
| | | getLogger().warn("Error: " + geomAttribute.getLocalName() + " unknown type!!!"); |
| | | } |
| | | |
| | | //also build a spatial index on each geometry column. |
| | | sql = new StringBuffer("CREATE INDEX spatial_"); |
| | | sql.append(tableName); |
| | | sql.append("_"); |
| | | sql.append(anAttributeType.getLocalName().toLowerCase()); |
| | | sql.append(" ON "); |
| | | sql.append(encodeSchemaTableName(tableName)); |
| | | sql.append(" USING GIST ("); |
| | | sql.append(encodeSchemaColumnName(anAttributeType.getLocalName())); |
| | | sql.append(");"); |
| | | |
| | | sqlStr = sql.toString(); |
| | | getLogger().info(sqlStr); |
| | | |
| | | if (shouldExecute) |
| | | { |
| | | result.add(sqlStr); |
| | | } |
| | | } |
| | | |
| | | con.commit(); |
| | | |
| | | } catch (SQLException e) |
| | | { |
| | | try |
| | | { |
| | | if (con != null) |
| | | { |
| | | con.rollback(); |
| | | } |
| | | } catch (SQLException sqle) |
| | | { |
| | | throw new IOException(sqle.getMessage()); |
| | | } |
| | | |
| | | throw (IOException) new IOException(e.getMessage()).initCause(e); |
| | | } finally |
| | | { |
| | | } |
| | | |
| | | if (!shouldExecute) |
| | | { |
| | | throw new IOException("The table " + tableName + " already exists."); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | private boolean tablePresent(String table, Connection conn) throws IOException |
| | | { |
| | | final int TABLE_NAME_COL = 3; |
| | | |
| | | try |
| | | { |
| | | conn = getConnection(); |
| | | |
| | | DatabaseMetaData meta = conn.getMetaData(); |
| | | String[] tableType = {"TABLE"}; |
| | | ResultSet tables = meta.getTables(null, |
| | | targetDataStore.getDatabaseSchemaName(), "%", tableType); |
| | | |
| | | while (tables.next()) |
| | | { |
| | | String tableName = tables.getString(TABLE_NAME_COL); |
| | | |
| | | if (allowTable(tableName) && (tableName != null) |
| | | && (tableName.equalsIgnoreCase(table))) |
| | | { |
| | | return (true); |
| | | } |
| | | } |
| | | |
| | | return false; |
| | | } catch (SQLException sqlException) |
| | | { |
| | | // JDBCUtils.close(conn, Transaction.AUTO_COMMIT, sqlException); |
| | | // conn = null; |
| | | |
| | | String message = "Error querying database for list of tables:" |
| | | + sqlException.getMessage(); |
| | | throw new DataSourceException(message, sqlException); |
| | | } finally |
| | | { |
| | | // JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); |
| | | } |
| | | } |
| | | |
| | | protected boolean allowTable(String tablename) |
| | | { |
| | | if (tablename.equals("geometry_columns")) |
| | | { |
| | | return false; |
| | | } else if (tablename.startsWith("spatial_ref_sys")) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | //others? |
| | | return true; |
| | | } |
| | | |
| | | |
| | | private StringBuffer makeSqlCreate(AttributeType[] attributeType) |
| | | throws IOException |
| | | { |
| | | StringBuffer buf = new StringBuffer(""); |
| | | |
| | | for (AttributeType anAttributeType : attributeType) |
| | | { |
| | | String typeName; |
| | | typeName = CLASS_MAPPINGS.get(anAttributeType.getBinding()); |
| | | if (typeName == null) |
| | | typeName = GEOM_CLASS_MAPPINGS.get(anAttributeType.getBinding()); |
| | | |
| | | if (typeName != null) |
| | | { |
| | | if (anAttributeType instanceof GeometryAttributeType) |
| | | { |
| | | typeName = "GEOMETRY"; |
| | | } else if (typeName.equals("VARCHAR")) |
| | | { |
| | | int length = -1; |
| | | Filter f = anAttributeType.getRestriction(); |
| | | if (f != null && f != Filter.EXCLUDE && f != Filter.INCLUDE && |
| | | (f instanceof PropertyIsLessThan || f instanceof PropertyIsLessThanOrEqualTo)) |
| | | { |
| | | try |
| | | { |
| | | BinaryComparisonOperator cf = (BinaryComparisonOperator) f; |
| | | if (cf.getExpression1() instanceof LengthFunction) |
| | | { |
| | | length = Integer.parseInt(((Literal) cf.getExpression2()).getValue().toString()); |
| | | } else |
| | | { |
| | | if (cf.getExpression2() instanceof LengthFunction) |
| | | { |
| | | length = Integer.parseInt(((Literal) cf.getExpression1()).getValue().toString()); |
| | | } |
| | | } |
| | | } catch (NumberFormatException e) |
| | | { |
| | | length = 256; |
| | | } |
| | | } else |
| | | { |
| | | length = 256; |
| | | } |
| | | |
| | | if (length < 1) |
| | | { |
| | | getLogger().warn("FeatureType did not specify string length; defaulted to 256"); |
| | | length = 256; |
| | | } else if (length > MAX_ALLOWED_VALUE) |
| | | { |
| | | length = MAX_ALLOWED_VALUE; |
| | | } |
| | | typeName = typeName + "(" + length + ")"; |
| | | } |
| | | |
| | | if (!anAttributeType.isNillable()) |
| | | { |
| | | typeName = typeName + " NOT NULL"; |
| | | } |
| | | |
| | | //TODO review!!! Is toString() always OK??? |
| | | Object defaultValue = anAttributeType.createDefaultValue(); |
| | | |
| | | if (defaultValue != null) |
| | | { |
| | | typeName = typeName + " DEFAULT '" |
| | | + defaultValue.toString() + "'"; |
| | | } |
| | | |
| | | buf.append(" \"").append(anAttributeType.getLocalName()).append("\" ").append(typeName).append(","); |
| | | |
| | | } else |
| | | { |
| | | String msg; |
| | | if (anAttributeType == null) |
| | | { |
| | | msg = "AttributeType was null!"; |
| | | } else |
| | | { |
| | | msg = "Type '" + anAttributeType.getBinding() + "' not supported!"; |
| | | } |
| | | throw (new IOException(msg)); |
| | | } |
| | | } |
| | | |
| | | return buf.deleteCharAt(buf.length() - 1); |
| | | } |
| | | |
| | | private String getGeometrySQLTypeName(Class type) |
| | | { |
| | | String res = GEOM_CLASS_MAPPINGS.get(type); |
| | | |
| | | if (res == null) |
| | | { |
| | | throw new RuntimeException("Unknown type name for class " + type |
| | | + " please update GEOMETRY_MAPPINGS"); |
| | | } |
| | | |
| | | return res; |
| | | } |
| | | |
| | | protected String getGeometryInsertText(Geometry geom, int srid) // throws IOException |
| | | { |
| | | if (geom == null) |
| | | { |
| | | return "null"; |
| | | } |
| | | |
| | | if (targetDataStore.isWKBEnabled()) |
| | | { |
| | | //String wkb = WKBEncoder.encodeGeometryHex(geom); |
| | | String wkb = WKBWriter.bytesToHex(new WKBWriter().write(geom)); |
| | | |
| | | if (targetDataStore.isByteaWKB()) |
| | | { |
| | | return "setSRID('" + wkb + "'::geometry," + srid + ")"; |
| | | } else |
| | | { |
| | | return "GeomFromWKB('" + wkb + "', " + srid + ")"; |
| | | } |
| | | } |
| | | |
| | | String geoText = geometryWriter.write(geom); |
| | | |
| | | return "GeometryFromText('" + geoText + "', " + srid + ")"; |
| | | } |
| | | |
| | | protected String makeInsertSql(Feature feature, int srid) // throws IOException |
| | | { |
| | | FeatureType featureType = feature.getFeatureType(); |
| | | |
| | | String tableName = encodeSchemaTableName(featureType.getTypeName()); |
| | | AttributeType[] attributeTypes = featureType.getAttributeTypes(); |
| | | |
| | | String attrValue; |
| | | |
| | | StringBuffer statementSQL = new StringBuffer("INSERT INTO " + tableName + " ("); |
| | | |
| | | // encode insertion for attributes, but remember to avoid auto-increment ones, |
| | | // they may be included in the feature type as well |
| | | for (AttributeType attributeType : attributeTypes) |
| | | { |
| | | String attName = attributeType.getLocalName(); |
| | | |
| | | if (feature.getAttribute(attName) != null) |
| | | { |
| | | String colName = encodeSchemaColumnName(attName); |
| | | statementSQL.append(colName).append(","); |
| | | } |
| | | } |
| | | |
| | | statementSQL.setCharAt(statementSQL.length() - 1, ')'); |
| | | statementSQL.append(" VALUES ("); |
| | | |
| | | Object[] attributes = feature.getAttributes(null); |
| | | |
| | | for (int i = 0; i < attributeTypes.length; i++) |
| | | { |
| | | attrValue = null; |
| | | |
| | | if (attributeTypes[i] instanceof GeometryAttributeType) |
| | | { |
| | | // String geomName = attributeTypes[i].getLocalName(); |
| | | // int srid = ftInfo.getSRID(geomName); |
| | | Geometry geometry = (Geometry) attributes[i]; |
| | | |
| | | if (geometry == null) |
| | | { |
| | | attrValue = "NULL"; |
| | | } else |
| | | { |
| | | attrValue = getGeometryInsertText(geometry, srid); |
| | | } |
| | | } else |
| | | { |
| | | if (attributes[i] != null) |
| | | { |
| | | attrValue = addQuotes(attributes[i]); |
| | | } |
| | | } |
| | | |
| | | if (attrValue != null) |
| | | { |
| | | statementSQL.append(attrValue).append(","); |
| | | } |
| | | } |
| | | |
| | | statementSQL.setCharAt(statementSQL.length() - 1, ')'); |
| | | |
| | | return (statementSQL.toString()); |
| | | } |
| | | |
| | | protected String addQuotes(Object value) |
| | | { |
| | | String retString; |
| | | |
| | | if (value != null) |
| | | { |
| | | if (value instanceof Number) |
| | | { |
| | | retString = value.toString(); |
| | | } else |
| | | { |
| | | retString = "'" + doubleQuote(value) + "'"; |
| | | } |
| | | } else |
| | | { |
| | | retString = "null"; |
| | | } |
| | | |
| | | return retString; |
| | | } |
| | | |
| | | String doubleQuote(Object obj) |
| | | { |
| | | return obj.toString().replaceAll("'", "''"); |
| | | } |
| | | |
| | | protected String encodeName(String tableName) |
| | | { |
| | | return tableName; |
| | | } |
| | | |
| | | protected String encodeColumnName(String colName) |
| | | { |
| | | return encodeName(colName); |
| | | } |
| | | |
| | | public String encodeSchemaTableName(String tableName) { |
| | | return schemaEnabled ? ("\"" + targetDataStore.getDatabaseSchemaName() + "\".\"" + tableName + "\"") |
| | | : ("\"" + tableName + "\""); |
| | | } |
| | | |
| | | public String encodeSchemaColumnName(String columnName) { |
| | | return "\"" + columnName + "\""; |
| | | } |
| | | } |
| | |
| | | import java.util.Iterator; |
| | | import java.util.List; |
| | | import java.util.TreeMap; |
| | | import java.sql.Connection; |
| | | import java.sql.SQLException; |
| | | import java.sql.Statement; |
| | | |
| | | import org.apache.commons.logging.Log; |
| | | import org.apache.commons.logging.LogFactory; |
| | |
| | | import org.geotools.data.DataStore; |
| | | import org.geotools.data.FeatureWriter; |
| | | import org.geotools.data.Transaction; |
| | | import org.geotools.data.DefaultTransaction; |
| | | import org.geotools.data.DataSourceException; |
| | | import org.geotools.data.FeatureStore; |
| | | 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 org.geotools.feature.SimpleFeature; |
| | | import org.geotools.feature.FeatureCollection; |
| | | import org.geotools.feature.FeatureCollections; |
| | | import org.postgresql.util.PSQLException; |
| | | |
| | | import com.vividsolutions.jts.geom.Geometry; |
| | | import com.vividsolutions.jts.geom.GeometryFactory; |
| | |
| | | static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); |
| | | static final GeometryFactory geometryFactory = new GeometryFactory(); |
| | | |
| | | private String dataOut = null; |
| | | private HashMap<FeatureType, ArrayList<String>> txFeaturesContext = new HashMap<FeatureType, ArrayList<String>>(); |
| | | |
| | | private HashMap<String, ArrayList<Feature>> featuresContext = new HashMap<String, ArrayList<Feature>>(); |
| | | private HashMap<String, FeatureWriter> featuresWriterContext = new HashMap<String, FeatureWriter>(); |
| | | |
| | | private PessimisticMapWrapper txFeaturesContext; |
| | | private TreeMap<String, FeatureTypeBuilder> typeBuilders = new TreeMap<String, FeatureTypeBuilder>(); |
| | | private TreeMap<String, FeatureType> featureTypes = new TreeMap<String, FeatureType>(); |
| | | |
| | | private TWD97GeometryConverterDecorator convertDecorator = null; |
| | | private String featureBaseName = null; |
| | | private boolean withIndex = false; |
| | | private boolean dropTableMode = true; |
| | | |
| | | public GeneralDgnConvertPostGISJobContext(String dataPath, DataStore targetDataStore) |
| | | { |
| | | super(dataPath, targetDataStore); |
| | | txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger); |
| | | convertDecorator = new TWD97GeometryConverterDecorator(); |
| | | } |
| | | |
| | |
| | | |
| | | if (!txFeaturesContext.containsKey(feature.getFeatureType())) |
| | | { |
| | | txFeaturesContext.put(feature.getFeatureType(), new ArrayList<Feature>()); |
| | | txFeaturesContext.put(feature.getFeatureType(), new ArrayList<String>()); |
| | | } |
| | | ArrayList<Feature> arrayList = (ArrayList<Feature>) txFeaturesContext.get(feature.getFeatureType()); |
| | | arrayList.add(feature); |
| | | ArrayList<String> arrayList = txFeaturesContext.get(feature.getFeatureType()); |
| | | if (feature.getDefaultGeometry() != null && !feature.getDefaultGeometry().isEmpty()) |
| | | arrayList.add(makeInsertSql(feature, -1)); |
| | | } else |
| | | { |
| | | logger.info("Unknown Element :" + element.getType() + ", lv=" + element.getLevelIndex()); |
| | | } |
| | | } |
| | | |
| | | private Transaction transaction; |
| | | |
| | | public void startTransaction() |
| | | { |
| | |
| | | logger.debug("Transaction is empty."); |
| | | } |
| | | |
| | | if (!featuresContext.isEmpty()) |
| | | if (!txFeaturesContext.isEmpty()) |
| | | { |
| | | updateDataStore(); |
| | | } |
| | | |
| | | txFeaturesContext.clear(); |
| | | } |
| | | |
| | | public void rollbackTransaction() |
| | | { |
| | | //txFeaturesContext.rollbackTransaction(); |
| | | if (!featuresContext.isEmpty()) |
| | | { |
| | | updateDataStore(); |
| | | } |
| | | txFeaturesContext.clear(); |
| | | } |
| | | |
| | | private void updateDataStore() |
| | | { |
| | | Iterator it = featuresContext.keySet().iterator(); |
| | | |
| | | Iterator<FeatureType> it = txFeaturesContext.keySet().iterator(); |
| | | String currentStmt = null; |
| | | try |
| | | { |
| | | while (it.hasNext()) |
| | | { |
| | | FeatureType featureType = (FeatureType) it.next(); |
| | | FeatureType featureType = it.next(); |
| | | logger.debug("Begin Save into PostGIS:" + featureType.getTypeName()); |
| | | |
| | | FeatureWriter writer; |
| | | if (featuresWriterContext.containsKey(featureType.getTypeName())) |
| | | ArrayList<String> stmtTexts = txFeaturesContext.get(featureType); |
| | | Connection conn = getConnection(); |
| | | boolean autoCommit = conn.getAutoCommit(); |
| | | conn.setAutoCommit(true); |
| | | |
| | | for (String stmtText : stmtTexts) |
| | | { |
| | | writer = featuresWriterContext.get(featureType.getTypeName()); |
| | | } else |
| | | { |
| | | if (!isExistFeature(featureType)) |
| | | currentStmt = stmtText; |
| | | Statement stmt = conn.createStatement(); |
| | | try |
| | | { |
| | | targetDataStore.createSchema(featureType); |
| | | writer = targetDataStore.getFeatureWriter(featureType.getTypeName(), |
| | | Transaction.AUTO_COMMIT); |
| | | } else |
| | | stmt.execute(stmtText); |
| | | } catch (PSQLException e) |
| | | { |
| | | writer = targetDataStore.getFeatureWriterAppend(featureType.getTypeName(), |
| | | Transaction.AUTO_COMMIT); |
| | | if (currentStmt != null) |
| | | { |
| | | logger.error("Execute:" + currentStmt); |
| | | } |
| | | logger.error(e.getServerErrorMessage()); |
| | | logger.error(e.getMessage(), e); |
| | | } finally { |
| | | stmt.close(); |
| | | } |
| | | featuresWriterContext.put(featureType.getTypeName(), writer); |
| | | /* |
| | | if ((i % BATCHSIZE) != 0) |
| | | { |
| | | stmt.addBatch(stmtText); |
| | | } else { |
| | | stmt.addBatch(stmtText); |
| | | stmt.executeBatch(); |
| | | } |
| | | i++; |
| | | */ |
| | | } |
| | | |
| | | ArrayList<Feature> features = featuresContext.get(featureType); |
| | | Iterator itFeature = features.iterator(); |
| | | while (itFeature.hasNext()) |
| | | { |
| | | Feature feature = (Feature) itFeature.next(); |
| | | ((SimpleFeature) writer.next()).setAttributes(feature.getAttributes(null)); |
| | | } |
| | | //writer.close(); |
| | | conn.setAutoCommit(autoCommit); |
| | | logger.debug("End Save into PostGIS:" + featureType.getTypeName()); |
| | | } |
| | | featuresContext.clear(); |
| | | } catch (MalformedURLException e) |
| | | { |
| | | logger.error(e.getMessage(), e); |
| | | } catch (IllegalAttributeException e) |
| | | { |
| | | logger.error(e.getMessage(), e); |
| | | } catch (IOException e) |
| | | } catch (SQLException e) |
| | | { |
| | | logger.error(e.getMessage(), e); |
| | | } |
| | |
| | | |
| | | public void closeFeatureWriter() throws IOException |
| | | { |
| | | |
| | | /* |
| | | for (FeatureWriter featureWriter : this.featuresWriterContext.values()) |
| | | { |
| | | featureWriter.close(); |
| | | } |
| | | |
| | | this.featuresWriterContext.clear(); |
| | | */ |
| | | } |
| | | |
| | | public FeatureType createPointFeatureElement(String featureName) throws SchemaException |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalPointFeatureTypeBuilder(featureName); |
| | | typeBuilders.put(featureName, typeBuilder); |
| | | clearFeatureData(typeBuilder); |
| | | } |
| | | return typeBuilders.get(featureName).getFeatureType(); |
| | | } |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalLineFeatureTypeBuilder(featureName); |
| | | typeBuilders.put(featureName, typeBuilder); |
| | | clearFeatureData(typeBuilder); |
| | | } |
| | | return typeBuilders.get(featureName).getFeatureType(); |
| | | } |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalArcFeatureTypeBuilder(featureName); |
| | | typeBuilders.put(featureName, typeBuilder); |
| | | clearFeatureData(typeBuilder); |
| | | } |
| | | return typeBuilders.get(featureName).getFeatureType(); |
| | | } |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalEllipseFeatureTypeBuilder(featureName); |
| | | typeBuilders.put(featureName, typeBuilder); |
| | | clearFeatureData(typeBuilder); |
| | | } |
| | | return typeBuilders.get(featureName).getFeatureType(); |
| | | } |
| | |
| | | Geometry geom = convertDecorator.toGeometry(geometryFactory); |
| | | double angle = textElement.getRotationAngle(); |
| | | String content = textElement.getText(); |
| | | content = content.replace('\u0000', ' '); |
| | | angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); |
| | | if (geom != null) |
| | | { |
| | |
| | | { |
| | | if (sb.length() != 0) |
| | | sb.append("\n"); |
| | | sb.append(text); |
| | | String content = text.replace('\u0000', ' '); |
| | | sb.append(content); |
| | | } |
| | | |
| | | if (geom != null) |
| | |
| | | return null; |
| | | } |
| | | |
| | | |
| | | public boolean isWithIndex() |
| | | { |
| | | return withIndex; |
| | | } |
| | | |
| | | public void setWithIndex(boolean withIndex) |
| | | { |
| | | this.withIndex = withIndex; |
| | | } |
| | | |
| | | public Log getLogger() |
| | | { |
| | | return logger; |
| | | } |
| | | |
| | | public boolean isDropTableMode() |
| | | { |
| | | return dropTableMode; |
| | | } |
| | | |
| | | public void setDropTableMode(boolean dropTableMode) |
| | | { |
| | | this.dropTableMode = dropTableMode; |
| | | } |
| | | |
| | | protected void clearFeatureData(FeatureTypeBuilder typeBuilder) throws SchemaException |
| | | { |
| | | String featureName = typeBuilder.getName(); |
| | | if (isExistFeature(typeBuilder.getFeatureType())) |
| | | { |
| | | try |
| | | { |
| | | Connection conn = targetDataStore.getConnection(Transaction.AUTO_COMMIT); |
| | | if (dropTableMode) |
| | | { |
| | | dropGeometryColumn(conn, featureName, |
| | | typeBuilder.getFeatureType().getDefaultGeometry().getLocalName()); |
| | | dropTable(conn, featureName); |
| | | |
| | | ArrayList<String> schemaTexts = createSchemaTexts(typeBuilder.getFeatureType()); |
| | | for (String stmtText : schemaTexts) |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | stmt.execute(stmtText); |
| | | stmt.close(); |
| | | } |
| | | } else { |
| | | deleteTable(conn, featureName); |
| | | } |
| | | conn.close(); |
| | | } catch (IOException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } else |
| | | { |
| | | try |
| | | { |
| | | Connection conn = targetDataStore.getConnection(Transaction.AUTO_COMMIT); |
| | | ArrayList<String> schemaTexts = createSchemaTexts(typeBuilder.getFeatureType()); |
| | | for (String stmtText : schemaTexts) |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | stmt.execute(stmtText); |
| | | stmt.close(); |
| | | } |
| | | conn.close(); |
| | | } catch (IOException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | import java.io.IOException; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.net.MalformedURLException; |
| | | import java.sql.Connection; |
| | | import java.sql.SQLException; |
| | | import java.sql.Statement; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.Iterator; |
| | |
| | | |
| | | import org.apache.commons.logging.Log; |
| | | import org.apache.commons.logging.LogFactory; |
| | | import org.apache.commons.transaction.memory.PessimisticMapWrapper; |
| | | import org.apache.commons.transaction.util.CommonsLoggingLogger; |
| | | import org.apache.commons.transaction.util.LoggerFacade; |
| | | import org.geotools.data.DataStore; |
| | | import org.geotools.data.FeatureWriter; |
| | | import org.geotools.data.Transaction; |
| | | import org.geotools.data.DefaultTransaction; |
| | | 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 org.geotools.feature.SimpleFeature; |
| | | import org.postgresql.util.PSQLException; |
| | | |
| | | import com.vividsolutions.jts.geom.Coordinate; |
| | | import com.vividsolutions.jts.geom.Envelope; |
| | |
| | | static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); |
| | | static final GeometryFactory geometryFactory = new GeometryFactory(); |
| | | TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator(); |
| | | public static final String SHPOUTPATH = "shpout"; |
| | | |
| | | private String dataOut = null; |
| | | private HashMap<FeatureType, ArrayList<String>> txFeaturesContext = new HashMap<FeatureType, ArrayList<String>>(); |
| | | |
| | | private HashMap<String, ArrayList<Feature>> featuresContext = new HashMap<String, ArrayList<Feature>>(); |
| | | private HashMap<String, FeatureWriter> featuresWriterContext = new HashMap<String, FeatureWriter>(); |
| | | |
| | | private PessimisticMapWrapper txFeaturesContext; |
| | | private FeatureTypeBuilder typeBuilderPnt = null; |
| | | private FeatureTypeBuilder typeBuilderRect = null; |
| | | private FeatureType featureType = null; |
| | | private FeatureType featureType2 = null; |
| | | |
| | | private boolean dropTableMode = true; |
| | | |
| | | public IndexDgnConvertPostGISJobContext(String dataPath, DataStore targetDataStore) |
| | | { |
| | | super(dataPath, targetDataStore); |
| | | txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger); |
| | | } |
| | | |
| | | public void putFeatureCollection(Element element) throws IllegalAttributeException, SchemaException |
| | |
| | | |
| | | if (!txFeaturesContext.containsKey(feature.getFeatureType())) |
| | | { |
| | | txFeaturesContext.put(feature.getFeatureType(), new ArrayList()); |
| | | txFeaturesContext.put(feature.getFeatureType(), new ArrayList<String>()); |
| | | } |
| | | ArrayList arrayList = (ArrayList) txFeaturesContext.get(feature.getFeatureType()); |
| | | arrayList.add(feature); |
| | | ArrayList<String> arrayList = txFeaturesContext.get(feature.getFeatureType()); |
| | | arrayList.add(makeInsertSql(feature, -1)); |
| | | |
| | | feature = createFeature2((TextElement) element); |
| | | if (feature == null) |
| | |
| | | |
| | | if (!txFeaturesContext.containsKey(feature.getFeatureType())) |
| | | { |
| | | txFeaturesContext.put(feature.getFeatureType(), new ArrayList()); |
| | | txFeaturesContext.put(feature.getFeatureType(), new ArrayList<String>()); |
| | | } |
| | | arrayList = (ArrayList) txFeaturesContext.get(feature.getFeatureType()); |
| | | arrayList.add(feature); |
| | | arrayList = txFeaturesContext.get(feature.getFeatureType()); |
| | | arrayList.add(makeInsertSql(feature, -1)); |
| | | } |
| | | |
| | | private Transaction transaction; |
| | | |
| | | public void startTransaction() |
| | | { |
| | | if (transaction == null) |
| | | transaction = new DefaultTransaction(getClass().getName()); |
| | | } |
| | | |
| | | public void commitTransaction() |
| | |
| | | if (!txFeaturesContext.isEmpty()) |
| | | { |
| | | logger.debug("Transaction size = " + txFeaturesContext.size()); |
| | | //txFeaturesContext.commitTransaction(); |
| | | } else |
| | | { |
| | | logger.debug("Transaction is empty."); |
| | | } |
| | | |
| | | if (!featuresContext.isEmpty()) |
| | | if (!txFeaturesContext.isEmpty()) |
| | | { |
| | | updateDataStore(); |
| | | } |
| | | |
| | | try |
| | | { |
| | | transaction.commit(); |
| | | transaction.close(); |
| | | } catch (IOException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } finally |
| | | { |
| | | transaction = null; |
| | | } |
| | | txFeaturesContext.clear(); |
| | | } |
| | | |
| | | public void rollbackTransaction() |
| | | { |
| | | //txFeaturesContext.rollbackTransaction(); |
| | | if (!featuresContext.isEmpty()) |
| | | { |
| | | updateDataStore(); |
| | | } |
| | | |
| | | try |
| | | { |
| | | transaction.rollback(); |
| | | transaction.close(); |
| | | } catch (IOException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } finally |
| | | { |
| | | transaction = null; |
| | | } |
| | | txFeaturesContext.clear(); |
| | | } |
| | | |
| | | private void updateDataStore() |
| | | { |
| | | Iterator it = featuresContext.keySet().iterator(); |
| | | |
| | | Iterator<FeatureType> it = txFeaturesContext.keySet().iterator(); |
| | | String currentStmt = null; |
| | | try |
| | | { |
| | | while (it.hasNext()) |
| | | { |
| | | FeatureType featureType = (FeatureType) it.next(); |
| | | FeatureType featureType = it.next(); |
| | | logger.debug("Begin Save PostGIS:" + featureType.getTypeName()); |
| | | |
| | | FeatureWriter writer; |
| | | if (featuresWriterContext.containsKey(featureType.getTypeName())) |
| | | ArrayList<String> stmtTexts = txFeaturesContext.get(featureType); |
| | | Connection conn = getConnection(); |
| | | boolean autoCommit = conn.getAutoCommit(); |
| | | conn.setAutoCommit(true); |
| | | // conn.setAutoCommit(false); |
| | | // Statement stmt = conn.createStatement(); |
| | | // int i = 0; |
| | | for (String stmtText : stmtTexts) |
| | | { |
| | | writer = featuresWriterContext.get(featureType.getTypeName()); |
| | | } else |
| | | { |
| | | if (!isExistFeature(featureType)) |
| | | currentStmt = stmtText; |
| | | Statement stmt = conn.createStatement(); |
| | | try |
| | | { |
| | | targetDataStore.createSchema(featureType); |
| | | writer = targetDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); |
| | | } else |
| | | stmt.execute(stmtText); |
| | | } catch (PSQLException e) |
| | | { |
| | | writer = targetDataStore.getFeatureWriterAppend(featureType.getTypeName(), Transaction.AUTO_COMMIT); |
| | | if (currentStmt != null) |
| | | { |
| | | logger.error("Execute:" + currentStmt); |
| | | } |
| | | logger.error(e.getServerErrorMessage()); |
| | | logger.error(e.getMessage(), e); |
| | | } finally { |
| | | stmt.close(); |
| | | } |
| | | featuresWriterContext.put(featureType.getTypeName(), writer); |
| | | /* |
| | | if ((i % BATCHSIZE) != 0) |
| | | { |
| | | stmt.addBatch(stmtText); |
| | | } else { |
| | | stmt.addBatch(stmtText); |
| | | stmt.executeBatch(); |
| | | } |
| | | i++; |
| | | */ |
| | | } |
| | | |
| | | ArrayList<Feature> features = featuresContext.get(featureType); |
| | | for (Feature feature1 : features) |
| | | /* |
| | | if ((i % BATCHSIZE) != 0) |
| | | { |
| | | ((SimpleFeature) writer.next()).setAttributes(feature1.getAttributes(null)); |
| | | stmt.executeBatch(); |
| | | } |
| | | //writer.close(); |
| | | writer.write(); |
| | | |
| | | stmt.close(); |
| | | stmtTexts.clear(); |
| | | */ |
| | | conn.setAutoCommit(autoCommit); |
| | | logger.debug("End Save PostGIS:" + featureType.getTypeName()); |
| | | } |
| | | featuresContext.clear(); |
| | | } catch (MalformedURLException e) |
| | | } catch (PSQLException e) |
| | | { |
| | | if (currentStmt != null) |
| | | { |
| | | logger.error("Execute:" + currentStmt); |
| | | } |
| | | logger.error(e.getServerErrorMessage()); |
| | | logger.error(e.getMessage(), e); |
| | | } catch (IllegalAttributeException e) |
| | | { |
| | | logger.error(e.getMessage(), e); |
| | | } catch (IOException e) |
| | | } catch (SQLException e) |
| | | { |
| | | logger.error(e.getMessage(), e); |
| | | } |
| | |
| | | |
| | | public void closeFeatureWriter() throws IOException |
| | | { |
| | | |
| | | /* |
| | | for (FeatureWriter featureWriter : this.featuresWriterContext.values()) |
| | | { |
| | | featureWriter.close(); |
| | | } |
| | | |
| | | this.featuresWriterContext.clear(); |
| | | */ |
| | | } |
| | | |
| | | public FeatureType createFeatureElement(String featureName) throws SchemaException |
| | |
| | | if (typeBuilderRect == null) |
| | | { |
| | | typeBuilderRect = FeatureTypeBuilderUtil.createNormalIndexFeatureTypeBuilder(featureName); |
| | | if (isExistFeature(typeBuilderRect.getFeatureType())) |
| | | { |
| | | try |
| | | { |
| | | Connection conn = targetDataStore.getConnection(Transaction.AUTO_COMMIT); |
| | | if (dropTableMode) |
| | | { |
| | | dropGeometryColumn(conn, featureName, |
| | | typeBuilderRect.getFeatureType().getDefaultGeometry().getLocalName()); |
| | | dropTable(conn, featureName); |
| | | ArrayList<String> schemaTexts = createSchemaTexts(typeBuilderRect.getFeatureType()); |
| | | for (String stmtText : schemaTexts) |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | stmt.execute(stmtText); |
| | | stmt.close(); |
| | | } |
| | | } else |
| | | { |
| | | deleteTable(conn, featureName); |
| | | } |
| | | conn.close(); |
| | | } catch (IOException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } else |
| | | { |
| | | try |
| | | { |
| | | Connection conn = targetDataStore.getConnection(Transaction.AUTO_COMMIT); |
| | | ArrayList<String> schemaTexts = createSchemaTexts(typeBuilderRect.getFeatureType()); |
| | | for (String stmtText : schemaTexts) |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | stmt.execute(stmtText); |
| | | stmt.close(); |
| | | } |
| | | conn.close(); |
| | | } catch (IOException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | } |
| | | return typeBuilderRect.getFeatureType(); |
| | | } |
| | |
| | | if (typeBuilderPnt == null) |
| | | { |
| | | typeBuilderPnt = FeatureTypeBuilderUtil.createNormalIndexTextFeatureTypeBuilder(featureName); |
| | | if (isExistFeature(typeBuilderPnt.getFeatureType())) |
| | | { |
| | | try |
| | | { |
| | | Connection conn = targetDataStore.getConnection(Transaction.AUTO_COMMIT); |
| | | if (dropTableMode) |
| | | { |
| | | dropGeometryColumn(conn, featureName, |
| | | typeBuilderPnt.getFeatureType().getDefaultGeometry().getLocalName()); |
| | | dropTable(conn, featureName); |
| | | |
| | | ArrayList<String> schemaTexts = createSchemaTexts(typeBuilderPnt.getFeatureType()); |
| | | for (String stmtText : schemaTexts) |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | stmt.execute(stmtText); |
| | | stmt.close(); |
| | | } |
| | | } else |
| | | { |
| | | deleteTable(conn, featureName); |
| | | } |
| | | conn.close(); |
| | | } catch (IOException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } else |
| | | { |
| | | try |
| | | { |
| | | Connection conn = targetDataStore.getConnection(Transaction.AUTO_COMMIT); |
| | | ArrayList<String> schemaTexts = createSchemaTexts(typeBuilderPnt.getFeatureType()); |
| | | for (String stmtText : schemaTexts) |
| | | { |
| | | Statement stmt = conn.createStatement(); |
| | | stmt.execute(stmtText); |
| | | stmt.close(); |
| | | } |
| | | conn.close(); |
| | | } catch (IOException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | } |
| | | return typeBuilderPnt.getFeatureType(); |
| | | } |
| | |
| | | { |
| | | return logger; |
| | | } |
| | | |
| | | public boolean isDropTableMode() |
| | | { |
| | | return dropTableMode; |
| | | } |
| | | |
| | | public void setDropTableMode(boolean dropTableMode) |
| | | { |
| | | this.dropTableMode = dropTableMode; |
| | | } |
| | | |
| | | public void clearOutputDatabase() |
| | | { |
| | | } |
| | | } |
| | |
| | | import org.geotools.feature.FeatureTypeBuilder; |
| | | |
| | | import com.vividsolutions.jts.geom.Geometry; |
| | | import com.vividsolutions.jts.geom.GeometryFactory; |
| | | import com.vividsolutions.jts.geom.Coordinate; |
| | | |
| | | public final class FeatureTypeBuilderUtil |
| | | { |
| | | protected static GeometryFactory _geomFactory = new GeometryFactory(); |
| | | |
| | | public static FeatureTypeBuilder createNormalPointFeatureTypeBuilder(String featureName) |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilder.newInstance(featureName); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("geom", Geometry.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symcolor", String.class, false, 12)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("font", Short.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("just", Short.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("height", Float.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("width", Float.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("angle", Float.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("context", String.class, true, 254)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("geom", Geometry.class, true)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symcolor", String.class, false, 12, "")); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("font", Short.class, false, 1, (short) 0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("just", Short.class, false, 1, (short) 0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("height", Float.class, false, 1, (float) 1.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("width", Float.class, false, 1, (float) 1.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("angle", Float.class, false, 1, (float) 0.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("context", String.class, false, 254, "")); |
| | | return typeBuilder; |
| | | } |
| | | |
| | | public static FeatureTypeBuilder createNormalLineFeatureTypeBuilder(String featureName) |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilder.newInstance(featureName); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("geom", Geometry.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symcolor", String.class, false, 12)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symweight", Short.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symstyle", Short.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("geom", Geometry.class, true)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symcolor", String.class, false, 12, "")); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symweight", Short.class, false, 1, (short) 0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symstyle", Short.class, false, 1, (short) 0)); |
| | | return typeBuilder; |
| | | } |
| | | |
| | |
| | | public static FeatureTypeBuilder createNormalIndexFeatureTypeBuilder(String featureName) |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilder.newInstance(featureName); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("geom", Geometry.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("x1", Double.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("y1", Double.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("x2", Double.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("y2", Double.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("tpclid", String.class, false, 12)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symcolor", String.class, false, 12)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symweight", Short.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symstyle", Short.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("geom", Geometry.class, true)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("x1", Double.class, false, 1, 0.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("y1", Double.class, false, 1, 0.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("x2", Double.class, false, 1, 0.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("y2", Double.class, false, 1, 0.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("tpclid", String.class, false, 12, "")); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symcolor", String.class, false, 12, "")); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symweight", Short.class, false, 1, (short) 0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symstyle", Short.class, false, 1, (short) 0)); |
| | | return typeBuilder; |
| | | } |
| | | |
| | |
| | | { |
| | | FeatureTypeBuilder typeBuilder = FeatureTypeBuilder.newInstance(featureName); |
| | | typeBuilder = FeatureTypeBuilder.newInstance(featureName); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("geom", Geometry.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symcolor", String.class, false, 12)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symweight", Short.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symstyle", Short.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("just", Short.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("height", Float.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("width", Float.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("angle", Float.class, false)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("tpclid", String.class, false, 12)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("geom", Geometry.class, true)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symcolor", String.class, false, 12, "")); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symweight", Short.class, false, 1, (short) 0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("symstyle", Short.class, false, 1, (short) 0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("just", Short.class, false, 1, (short) 0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("height", Float.class, false, 1, (float) 0.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("width", Float.class, false, 1, (float) 0.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("angle", Float.class, false, 1, (float) 0.0)); |
| | | typeBuilder.addType(AttributeTypeFactory.newAttributeType("tpclid", String.class, false, 12, "")); |
| | | return typeBuilder; |
| | | } |
| | | |