package com.ximple.eofms.jobs; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.sql.SQLException; import org.apache.commons.logging.Log; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import com.vividsolutions.jts.util.Assert; import oracle.sql.BLOB; public abstract class AbstractOracleDatabaseJob implements Job { private static final String SHPDATA_DIR = "SHPDATA_DIR"; private static final String CONFSHPFILTER = "SHPFILTER_CONF"; private static final String SPATAILSCHEMA = "ORGSCHEMA"; private static final String ORAHOST = "ORAHOST"; private static final String ORAINST = "ORAINST"; private static final String ORAPORT = "ORAPORT"; private static final String ORAUSER = "ORAUSER"; private static final String ORAPASS = "ORAPASS"; private static final String TESTMODE = "TESTMODE"; private static final String TESTCOUNT = "TESTCOUNT"; protected String _dataPath; protected String _filterPath; protected String _oracleHost; protected String _oracleInstance; protected String _oraclePort; protected String _username; protected String _password; protected String _orgSchema; protected boolean _testMode = false; protected int _testCount = -1; public abstract void execute(JobExecutionContext context) throws JobExecutionException; public Log getLogger() { return null; } protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException { // The directory to scan is stored in the job map JobDataMap dataMap = jobDetail.getJobDataMap(); _dataPath = dataMap.getString(SHPDATA_DIR); _filterPath = dataMap.getString(CONFSHPFILTER); _oracleHost = dataMap.getString(ORAHOST); _oracleInstance = dataMap.getString(ORAINST); _oraclePort = dataMap.getString(ORAPORT); _username = dataMap.getString(ORAUSER); _password = dataMap.getString(ORAPASS); _orgSchema = dataMap.getString(SPATAILSCHEMA); _testMode = dataMap.getBooleanFromString(TESTMODE); _testCount = dataMap.getIntFromString(TESTCOUNT); // Validate the required input if (_dataPath == null) { Log logger = getLogger(); if (logger != null) { logger.warn("Cannot found data directory in configarion."); } throw new JobExecutionException("Directory not configured"); } // Make sure the directory exists File dir = new File(_dataPath); if (!dir.exists()) { Log logger = getLogger(); if (logger != null) { logger.warn("Cannot found data directory in file system.[" + _dataPath + "]"); } throw new JobExecutionException("Invalid Dir " + _dataPath); } if (_oracleHost == null) { throw new JobExecutionException("Unknown Oracle Host."); } if (_oracleInstance == null) { throw new JobExecutionException("Unknown Oracle Instance."); } if (_username == null) { throw new JobExecutionException("Unknown Oracle Username."); } if (_password == null) { throw new JobExecutionException("Unknown Oracle Password."); } if (_orgSchema == null) { throw new JobExecutionException("Unknown Spatial Database Schema."); } } protected OracleConvertJobContext prepareJobContext() { return new OracleConvertJobContext(); } protected static byte[] getBytesFromBLOB(BLOB blob) throws SQLException { byte[] raw = null; // BLOB blob = (BLOB) rs.getBlob(1); 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) { e.printStackTrace(); // To change body of catch statement use File | Settings | File Templates. Assert.shouldNeverReachHere(); } return raw; } }