.gitattributes
@@ -68,6 +68,7 @@ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java svneol=native#text/plain xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java
@@ -274,6 +274,7 @@ public void write(ByteBuffer buffer, Object element) { buffer.put(((Element) element).rawBuffer); } public int getLength(Object element) xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java
@@ -80,11 +80,15 @@ { TextElement txtElement = (TextElement) element; double angle = txtElement.getRotationAngle(); angle -= 270.0; angle = -angle; angle = ((angle < 0.0) ? (angle + 360.0) : angle); angle = ((angle > 360.0) ? (angle - 360.0) : (angle)); /* if (angle != 0.0) { angle -= 270.0; angle = -angle; angle = ((angle < 0.0) ? (angle + 360.0) : angle); angle = ((angle > 360.0) ? (angle - 360.0) : (angle)); } */ if (txtElement.getText().length() == 0) { logger.info("CreateSymbolStrategy cannot conver " + element.toString() + xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java
@@ -81,10 +81,15 @@ { TextElement txtElement = (TextElement) element; double angle = txtElement.getRotationAngle(); angle -= 270.0; angle = -angle; angle = ((angle < 0.0) ? (angle + 360.0) : angle); angle = ((angle > 360.0) ? (angle - 360.0) : (angle)); /* if (angle != 0.0) { angle -= 270.0; angle = -angle; angle = ((angle < 0.0) ? (angle + 360.0) : angle); angle = ((angle > 360.0) ? (angle - 360.0) : (angle)); } */ convertDecorator.setConverter(txtElement); Feature feature = featureType.create(new Object[]{ convertDecorator.toGeometry(geometryFactory), @@ -106,7 +111,6 @@ } else if (element instanceof TextNodeElement) { TextNodeElement nodeElement = (TextNodeElement) element; convertDecorator.setConverter(nodeElement); String[] texts = nodeElement.getTextArray(); StringBuffer sb = new StringBuffer(); for (String text : texts) @@ -117,10 +121,16 @@ } double angle = nodeElement.getRotationAngle(); angle -= 270.0; angle = -angle; angle = ((angle < 0.0) ? (angle + 360.0) : angle); angle = ((angle > 360.0) ? (angle - 360.0) : (angle)); /* if (angle != 0.0) { angle -= 270.0; angle = -angle; angle = ((angle < 0.0) ? (angle + 360.0) : angle); angle = ((angle > 360.0) ? (angle - 360.0) : (angle)); } */ convertDecorator.setConverter(nodeElement); Feature feature = featureType.create(new Object[]{ convertDecorator.toGeometry(geometryFactory), (int) fLinkage.getFsc(), xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java
@@ -273,6 +273,7 @@ TextElement textElement = (TextElement) element; convertDecorator.setConverter(textElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); double angle = textElement.getRotationAngle(); if (geom != null) { return featureType.create(new Object[]{ @@ -282,7 +283,7 @@ textElement.getJustification(), textElement.getTextHeight(), textElement.getTextWidth(), textElement.getRotationAngle(), angle, textElement.getText() }); } else xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java
@@ -171,6 +171,7 @@ int current = 0; //jobContext.startTransaction(); jobContext.setCurrentSchema(querySchema); jobContext.getExecutionContext().put("ConvertDgn2ShpJobProgress", 0); for (OrderedMapIterator it = map.orderedMapIterator(); it.hasNext();) { xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java
@@ -44,6 +44,8 @@ static final String SHPOUTPATH = "shpout"; private OracleElementLogging elmLogger = null; static { try @@ -68,6 +70,8 @@ private String dataOut = null; private String _convertDB = null; private String _convertFile = null; private String currentSchema = null; private boolean schemaChanged = false; public OracleConvertJobContext(String filterConfig) { @@ -97,7 +101,7 @@ { // config = new File("conf/DefaultConvertShpFilter.xml"); filterURL = this.getClass().getResource("/conf/DefaultConvertShpFilter.xml"); // filterURL = this.getClass().getResource("/conf/ConvertShpFilterForLevel.xml"); // filterURL = this.getClass().getResource("/conf/ConvertShpFilterForLevel.xml"); } assert filterURL != null; return (ElementDispatcher) digester.parse(filterURL); @@ -133,6 +137,7 @@ ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" + (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID()))); getElementLogging().logElement(element, getCurrentSchema()); return; } @@ -146,15 +151,15 @@ public void startTransaction() { //txFeaturesContext.startTransaction(); //txFeaturesContext.startTransaction(); } public void commitTransaction() { if (!txFeaturesContext.isEmpty()) { if (!txFeaturesContext.isEmpty()) { logger.debug("Transaction size = " + txFeaturesContext.size()); //txFeaturesContext.commitTransaction(); //txFeaturesContext.commitTransaction(); } else { logger.debug("Transaction is empty."); @@ -164,11 +169,14 @@ { updateDataStore(); } if (this.getElementLogging() != null) this.getElementLogging().flashLogging(); } public void rollbackTransaction() { //txFeaturesContext.rollbackTransaction(); //txFeaturesContext.rollbackTransaction(); if (!featuresContext.isEmpty()) { updateDataStore(); @@ -188,16 +196,15 @@ logger.debug("Begin Save shapefile:" + sfile.toURI()); FeatureWriter writer = null; if(featuresWriterContext.containsKey(featureType.getTypeName())) if (featuresWriterContext.containsKey(featureType.getTypeName())) { writer = featuresWriterContext.get(featureType.getTypeName()) ; } else writer = featuresWriterContext.get(featureType.getTypeName()); } else { ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL()); shapefileDataStore.createSchema(featureType); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); featuresWriterContext.put(featureType.getTypeName() , writer); ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL()); shapefileDataStore.createSchema(featureType); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); featuresWriterContext.put(featureType.getTypeName(), writer); } ArrayList features = (ArrayList) featuresContext.get(featureType); @@ -236,9 +243,11 @@ /** * Ãö³¬³]³Æ¼g¤J¾¹ * * @throws IOException IOµo¥Í¿ù»~ */ public void closeFeatureWriter() throws IOException { public void closeFeatureWriter() throws IOException { for (FeatureWriter featureWriter : this.featuresWriterContext.values()) { @@ -250,6 +259,7 @@ /** * ¨ú±o¸ê®Æ¿é¥X¸ô®| * * @return ¸ô®|ªº¦r¦ê */ public String getDataOutPath() @@ -278,4 +288,25 @@ { _convertFile = convertFile; } private OracleElementLogging getElementLogging() { if (elmLogger == null) { elmLogger = new OracleElementLogging(getOracleConnection()); elmLogger.setDataPath(this.getDataPath()); } return elmLogger; } public String getCurrentSchema() { return currentSchema; } public void setCurrentSchema(String querySchema) { this.currentSchema = querySchema; this.schemaChanged = true; } } xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java
New file @@ -0,0 +1,288 @@ package com.ximple.eofms.jobs; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.vividsolutions.jts.util.Assert; import oracle.sql.BLOB; import com.ximple.eofms.util.PrintfFormat; import com.ximple.io.dgn7.ArcElement; import com.ximple.io.dgn7.ComplexChainElement; import com.ximple.io.dgn7.ComplexShapeElement; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.EllipseElement; import com.ximple.io.dgn7.LineElement; import com.ximple.io.dgn7.LineStringElement; import com.ximple.io.dgn7.ShapeElement; import com.ximple.io.dgn7.TextElement; import com.ximple.io.dgn7.TextNodeElement; public class OracleElementLogging { static Log logger = LogFactory.getLog(OracleElementLogging.class); private static final String ELMOUTPATH = "elmout"; private static final String TAB_IGDSSEED = "SD$IGDSSET_SEED"; private Connection connection; private String dataOut = null; private String dataPath; private String currentSchema; private boolean schemaChanged; private FileOutputStream fos = null; private FileChannel fch = null; private int logCount = 0; public OracleElementLogging(Connection connection) { this.connection = connection; } public String getDataOutPath() { if (dataOut == null) { File outPath = new File(getDataPath(), ELMOUTPATH); if (!outPath.exists()) { outPath.mkdir(); } else if (!outPath.isDirectory()) { outPath.mkdir(); } dataOut = outPath.toString(); } return dataOut; } public String getDataPath() { return dataPath; } public void setDataPath(String dataPath) { this.dataPath = dataPath; } public void logElement(Element element, String currentSchema) { if (this.currentSchema.equalsIgnoreCase(currentSchema)) { schemaChanged = true; this.currentSchema = currentSchema; try { createNewStream(); } catch (IOException e) { logger.warn(e.getMessage(), e); return; } catch (SQLException e) { logger.warn(e.getMessage(), e); return; } } if (fch != null) { ByteBuffer buf = null; if (element instanceof LineElement) { int size = LineElement.ElementHandler.getInstance().getLength(element); buf = ByteBuffer.allocate(size * 2); LineElement.ElementHandler.getInstance().write(buf, element); } else if (element instanceof ShapeElement) { int size = ShapeElement.ElementHandler.getInstance().getLength(element); buf = ByteBuffer.allocate(size * 2); ShapeElement.ElementHandler.getInstance().write(buf, element); } else if (element instanceof LineStringElement) { int size = LineStringElement.ElementHandler.getInstance().getLength(element); buf = ByteBuffer.allocate(size * 2); LineStringElement.ElementHandler.getInstance().write(buf, element); } else if (element instanceof ComplexChainElement) { int size = ComplexChainElement.ElementHandler.getInstance().getLength(element); buf = ByteBuffer.allocate(size * 2); ComplexChainElement.ElementHandler.getInstance().write(buf, element); } else if (element instanceof ComplexShapeElement) { int size = ComplexShapeElement.ElementHandler.getInstance().getLength(element); buf = ByteBuffer.allocate(size * 2); ComplexShapeElement.ElementHandler.getInstance().write(buf, element); } else if (element instanceof ArcElement) { int size = ArcElement.ElementHandler.getInstance().getLength(element); buf = ByteBuffer.allocate(size * 2); ArcElement.ElementHandler.getInstance().write(buf, element); } else if (element instanceof EllipseElement) { int size = EllipseElement.ElementHandler.getInstance().getLength(element); buf = ByteBuffer.allocate(size * 2); EllipseElement.ElementHandler.getInstance().write(buf, element); } else if (element instanceof TextElement) { int size = TextElement.ElementHandler.getInstance().getLength(element); buf = ByteBuffer.allocate(size * 2); TextElement.ElementHandler.getInstance().write(buf, element); } else if (element instanceof TextNodeElement) { int size = TextNodeElement.ElementHandler.getInstance().getLength(element); buf = ByteBuffer.allocate(size * 2); TextNodeElement.ElementHandler.getInstance().write(buf, element); } if ((buf != null) && (fch != null)) { try { fch.write(buf); } catch (IOException e) { logger.warn(e.getMessage(), e); } } } } private void createNewStream() throws IOException, SQLException { if (fos != null) { putEndOfFileElement(); fos.close(); fos = null; fch = null; } File logFile = new File(getDataOutPath(), this.currentSchema + ".dgn"); while (logFile.exists()) { logFile = new File(getDataOutPath(), this.currentSchema + "-" + (++logCount) +".dgn"); } fos = new FileOutputStream(logFile); fch = fos.getChannel(); prepareOutputElementStream(); schemaChanged = false; } private void putEndOfFileElement() throws IOException { if (fch == null) return; ByteBuffer bf = ByteBuffer.allocate(4); bf.putInt(-1); fch.write(bf); } private void prepareOutputElementStream() throws SQLException, IOException { if (connection == null) { logger.warn("connection is null"); return; } String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID"; PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt); String fetchSrcStmt = spf.sprintf(new Object[]{currentSchema, TAB_IGDSSEED}); Statement stmtSrc = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); ResultSet rsSrc = stmtSrc.executeQuery(fetchSrcStmt); while (rsSrc.next()) { byte[] raw; if (rsSrc.getMetaData().getColumnType(1) == Types.BLOB) { BLOB blob = (BLOB) rsSrc.getBlob(1); raw = getBytesFromBLOB(blob); blob.close(); } else { raw = rsSrc.getBytes(1); } if (raw != null) { putElementIntoStream(raw); } } } private void putElementIntoStream(byte[] raw) throws IOException { if (fch != null) fch.write(ByteBuffer.wrap(raw)); } protected static byte[] getBytesFromBLOB(BLOB blob) throws SQLException { byte[] raw = null; int optimalSize = blob.getChunkSize(); byte[] chunk = new byte[optimalSize]; InputStream is = blob.getBinaryStream(0); ByteBuffer buffer = null; // ByteBuffer.allocate(optimalSize); int len = 0; try { while ((len = (is.read(chunk))) != -1) { if (buffer != null) { buffer.limit(buffer.limit() + len); } else { buffer = ByteBuffer.allocate(len); } buffer.put(chunk); } is.close(); buffer.position(0); raw = buffer.array(); } catch (IOException e) { logger.warn(e.getMessage(), e); Assert.shouldNeverReachHere(); } return raw; } public void flashLogging() { if (fos != null) { try { fos.close(); } catch (IOException e) { logger.warn(e.getMessage(), e); } fos = null; fch = null; } } }