forked from geodmms/xdgnjobs

?? ?
2008-05-16 5c0e9634ef20452c9fc66bb14a469e0a05369899
update for EOFM-90
7 files modified
1 files added
349 ■■■■■ changed files
.gitattributes 1 ●●●● patch | view | raw | blame | history
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java 1 ●●●● patch | view | raw | blame | history
xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java 6 ●●●● patch | view | raw | blame | history
xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java 12 ●●●●● patch | view | raw | blame | history
xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java 3 ●●●● patch | view | raw | blame | history
xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java 1 ●●●● patch | view | raw | blame | history
xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java 37 ●●●●● patch | view | raw | blame | history
xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java 288 ●●●●● patch | view | raw | blame | history
.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();
            /*
            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();
            /*
            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();
            /*
            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)
    {
@@ -133,6 +137,7 @@
                    ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
                    (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID())));
            getElementLogging().logElement(element, getCurrentSchema());
            return;
        }
@@ -164,6 +169,9 @@
        {
            updateDataStore();
        }
        if (this.getElementLogging() != null)
            this.getElementLogging().flashLogging();
    }
    public void rollbackTransaction()
@@ -191,8 +199,7 @@
                if(featuresWriterContext.containsKey(featureType.getTypeName()))
                {
                    writer = featuresWriterContext.get(featureType.getTypeName()) ;
                }
                else
                } else
                {
                  ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL());
                  shapefileDataStore.createSchema(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;
        }
    }
}