From 5c0e9634ef20452c9fc66bb14a469e0a05369899 Mon Sep 17 00:00:00 2001 From: ?? ? <ulysseskao@ximple.com.tw> Date: Fri, 16 May 2008 12:25:44 +0800 Subject: [PATCH] update for EOFM-90 --- .gitattributes | 1 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java | 61 ++++++-- xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java | 1 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java | 3 xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java | 1 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java | 14 + xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java | 28 ++- xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java | 288 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 367 insertions(+), 30 deletions(-) diff --git a/.gitattributes b/.gitattributes index 369280b..0117d12 100644 --- a/.gitattributes +++ b/.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 diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java index 78c9bee..1a19a06 100644 --- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java +++ b/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) diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java index 0dff6a6..44cae9d 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java +++ b/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() + diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java index 2f7c92e..0dd716a 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java +++ b/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(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java index 73c7ac1..798c86e 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java +++ b/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 diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java index fb26630..46f2df1 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java +++ b/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();) { diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java index fc184f8..ee1cf24 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java +++ b/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; + } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java new file mode 100644 index 0000000..827f0e0 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java @@ -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; + } + } +} -- Gitblit v0.0.0-SNAPSHOT