package com.ximple.eofms.jobs;
|
|
import java.sql.ResultSet;
|
import java.sql.SQLException;
|
import java.sql.Statement;
|
import java.sql.Types;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.TimeZone;
|
|
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.LogFactory;
|
import org.quartz.JobDetail;
|
import org.quartz.JobExecutionContext;
|
import org.quartz.JobExecutionException;
|
|
import oracle.jdbc.OracleConnection;
|
import oracle.jdbc.OracleResultSet;
|
import oracle.sql.ARRAY;
|
import oracle.sql.BLOB;
|
|
import com.ximple.eofms.util.BinConverter;
|
import com.ximple.eofms.util.ByteArrayCompressor;
|
import com.ximple.util.PrintfFormat;
|
|
/**
|
*
|
*/
|
public class OracleConvertDgn2ShpJob extends AbstractOracleDatabaseJob
|
{
|
static Log logger = LogFactory.getLog(OracleConvertDgn2ShpJob.class);
|
|
private static final int FETCHSIZE = 30;
|
private static final int BATCHSIZE = 25;
|
|
public void execute(JobExecutionContext context) throws JobExecutionException
|
{
|
// Every job has its own job detail
|
JobDetail jobDetail = context.getJobDetail();
|
|
// The name is defined in the job definition
|
String jobName = jobDetail.getName();
|
|
// Log the time the job started
|
logger.info(jobName + " fired at " + new Date());
|
extractJobConfiguration(jobDetail);
|
|
OracleConvertJobContext jobContext = prepareJobContext();
|
jobContext.setConnectionInfo(_oracleHost, _oraclePort, _oracleInstance);
|
jobContext.setLogin(_username, _password);
|
|
try
|
{
|
exetcuteConvert(jobContext, _orgSchema, _dataPath);
|
} catch (SQLException e)
|
{
|
throw new JobExecutionException("Database error.", e);
|
}
|
|
}
|
|
private void exetcuteConvert(OracleConvertJobContext jobContext,
|
String querySchema, String dataPath) throws SQLException
|
{
|
// verify igdsset_seed
|
String srcTable = "IGSET_1";
|
String destTable = OracleConvertJobContext.TABLE_PREFIX + "ELMSET_1";
|
long startTime = System.currentTimeMillis();
|
ArrayList srcElms = queryIgsetElement(jobContext, querySchema, srcTable);
|
long currentTime = System.currentTimeMillis();
|
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSS");
|
|
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
|
|
long elapsed = currentTime - startTime;
|
|
System.out.println("Old Format:" + dateFormat.format(new Date(elapsed)));
|
logger.info("query source element complete.");
|
startTime = System.currentTimeMillis();
|
|
ArrayList dstElms = queryRawElement(jobContext, querySchema, destTable);
|
|
currentTime = System.currentTimeMillis();
|
dateFormat = new SimpleDateFormat("HH:mm:ss:SSS");
|
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
|
elapsed = currentTime - startTime;
|
System.out.println("New Format:" + dateFormat.format(new Date(elapsed)));
|
logger.info("query dest element complete.");
|
// Assert.isTrue(srcElms.size() == dstElms.size(), "src[" + srcElms.size() + "] != dest[" + dstElms.size() + "]");
|
}
|
|
private ArrayList queryIgsetElement(OracleConvertJobContext jobContext,
|
String srcschema, String srctable) throws SQLException
|
{
|
ArrayList result = new ArrayList();
|
OracleConnection connection = jobContext.getOracleConnection();
|
String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID";
|
PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt);
|
String fetchSrcStmt = spf.sprintf(new Object[]{srcschema, srctable});
|
Statement stmtSrc = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
|
|
stmtSrc.setFetchSize(FETCHSIZE);
|
|
ResultSet rsSrc = stmtSrc.executeQuery(fetchSrcStmt);
|
|
while (rsSrc.next())
|
{
|
byte[] raw = null;
|
|
if (rsSrc.getMetaData().getColumnType(1) == Types.BLOB)
|
{
|
BLOB blob = (BLOB) rsSrc.getBlob(1);
|
|
raw = getBytesFromBLOB(blob);
|
blob.close();
|
} else
|
{
|
raw = rsSrc.getBytes(1);
|
}
|
|
result.add(raw);
|
}
|
|
return result;
|
}
|
|
private ArrayList queryRawElement(OracleConvertJobContext jobContext,
|
String srcschema, String srctable) throws SQLException
|
{
|
ArrayList result = new ArrayList();
|
OracleConnection connection = jobContext.getOracleConnection();
|
String fetchDestStmtFmt = "SELECT ELEMENT FROM \"%s\".\"%s\" ORDER BY ROWID";
|
PrintfFormat spf = new PrintfFormat(fetchDestStmtFmt);
|
String fetchDestStmt = spf.sprintf(new Object[]{srcschema, srctable});
|
Statement stmtDest = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
|
|
stmtDest.setFetchSize(FETCHSIZE);
|
|
ResultSet rsDest = stmtDest.executeQuery(fetchDestStmt);
|
|
while (rsDest.next())
|
{
|
ARRAY rawsValue = ((OracleResultSet) rsDest).getARRAY(1);
|
long[] rawData = rawsValue.getLongArray();
|
byte[] comparessedValue;
|
|
/*
|
if (dataMode == TransferTask.DataMode.Normal)
|
{
|
comparessedValue = BinConverter.unmarshalByteArray(rawData, true);
|
} else
|
{
|
comparessedValue = BinConverter.unmarshalCompactByteArray(rawData);
|
}
|
*/
|
comparessedValue = BinConverter.unmarshalByteArray(rawData, true);
|
|
byte[] rawDest = ByteArrayCompressor.decompressByteArray(comparessedValue);
|
|
result.add(rawDest);
|
}
|
|
return result;
|
}
|
|
private boolean equalRawData(byte[] rawSrc, byte[] rawDest)
|
{
|
if (rawSrc.length != rawDest.length)
|
{
|
return false;
|
}
|
|
for (int i = 0; i < rawSrc.length; i++)
|
{
|
if (rawSrc[i] != rawDest[i])
|
{
|
return false;
|
}
|
}
|
|
return true;
|
}
|
}
|