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 java.util.ArrayList; import java.util.Map; import java.util.StringTokenizer; import java.util.TreeMap; import com.vividsolutions.jts.util.Assert; import com.ximple.eofms.jobs.context.AbstractOracleJobContext; import org.apache.commons.logging.Log; import org.geotools.data.DataStore; import org.geotools.data.jdbc.ConnectionPoolManager; import org.geotools.data.oracle.OracleDataStore; import org.geotools.data.oracle.OracleDataStoreFactory; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import oracle.sql.BLOB; public abstract class AbstractOracleDatabaseJob implements Job { /** The Oracle driver class name */ private static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver"; private static final String ORACLE_URL = "jdbc:oracle:thin:@"; private static final String PROPUsrKey = "user"; private static final String PROPPassKey = "password"; private static final String JOBDATA_DIR = "JOBDATA_DIR"; private static final String CONFELMSFILTER = "ELMSFILTER_CONF"; private static final String SPATAILSCHEMA = "ORGSCHEMA"; private static final String CONVERTDB = "CONVERTDB"; private static final String CONVERTFILE = "CONVERTFILE"; private static final String CONVERTELEMIN = "CONVERTELEMIN"; private static final String CREATEDUMMY = "CREATEDUMMY"; private static final String ELEMLOG = "ELEMLOG"; 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 static OracleDataStoreFactory dataStoreFactory = new OracleDataStoreFactory(); protected String _dataPath; protected String _filterPath; protected String _oracleHost; protected String _oracleInstance; protected String _oraclePort; protected String _username; protected String _password; protected String _convertDB; protected String _convertFile; protected String _convertElementIn; protected String _elementLogging; protected String _createDummy; protected ArrayList _orgSchema = new ArrayList(); protected boolean _testMode = false; protected int _testCount = -1; protected OracleDataStore sourceDataStore; private boolean driverFound = true; protected AbstractOracleDatabaseJob() { try { Class.forName(JDBC_DRIVER); } catch (Throwable t) { // must be running off dummy jar! driverFound = false; } } public abstract void execute(JobExecutionContext context) throws JobExecutionException; public abstract Log getLogger(); protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException { // The directory to scan is stored in the job map JobDataMap dataMap = jobDetail.getJobDataMap(); _dataPath = dataMap.getString(JOBDATA_DIR); _filterPath = dataMap.getString(CONFELMSFILTER); _oracleHost = dataMap.getString(ORAHOST); _oracleInstance = dataMap.getString(ORAINST); _oraclePort = dataMap.getString(ORAPORT); _username = dataMap.getString(ORAUSER); _password = dataMap.getString(ORAPASS); _convertDB = dataMap.getString(CONVERTDB); _convertFile = dataMap.getString(CONVERTFILE); _convertElementIn = dataMap.getString(CONVERTELEMIN); _elementLogging = dataMap.getString(ELEMLOG); _createDummy = dataMap.getString(CREATEDUMMY); Log logger = getLogger(); /* logger.info("JOBDATA_DIR=" + _dataPath); logger.info("CONFELMSFILTER=" + _filterPath); logger.info("ORAHOST=" + _oracleHost); logger.info("ORAINST=" + _oracleInstance); logger.info("ORAPORT=" + _oraclePort); logger.info("ORAUSER=" + _username); logger.info("ORAPASS=" + _password); logger.info("CONVERTDB=" + _convertDB); logger.info("CONVERTFILE=" + _convertFile); logger.info("CONVERTELEMIN=" + _convertElementIn); logger.info("ELEMLOG=" + _elementLogging); */ String strSchema = dataMap.getString(SPATAILSCHEMA); StringTokenizer st = new StringTokenizer(strSchema, ","); while (st.hasMoreTokens()) { String aSchema = st.nextToken().trim(); _orgSchema.add(aSchema); } _testMode = dataMap.getBooleanFromString(TESTMODE); _testCount = dataMap.getIntFromString(TESTCOUNT); // Validate the required input if (_dataPath == null) { 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()) { logger = getLogger(); if (logger != null) { logger.warn("Cannot found data directory in file system.[" + _dataPath + "]"); } throw new JobExecutionException("Invalid Dir " + _dataPath); } if (_oracleHost == null) { logger.warn("OracleHOST is null"); throw new JobExecutionException("Unknown Oracle Host."); } if (_oracleInstance == null) { logger.warn("OracleINSTANCE is null"); throw new JobExecutionException("Unknown Oracle Instance."); } if (_username == null) { logger.warn("OracleUSER is null"); throw new JobExecutionException("Unknown Oracle Username."); } if (_password == null) { logger.warn("OraclePASS is null"); throw new JobExecutionException("Unknown Oracle Password."); } if (_orgSchema == null) { logger.warn("OracleSchema is null"); throw new JobExecutionException("Unknown Spatial Database Schema."); } } protected abstract AbstractOracleJobContext prepareJobContext(String filterPath); 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; 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(); assert buffer != null; 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; } public boolean isDriverFound() { return driverFound; } public String getDataPath() { return _dataPath; } public String getFilterPath() { return _filterPath; } public String getOracleHost() { return _oracleHost; } public String getOracleInstance() { return _oracleInstance; } public String getOraclePort() { return _oraclePort; } public String getUsername() { return _username; } public String getPassword() { return _password; } public ArrayList getOriginSchema() { return _orgSchema; } public boolean isTestMode() { return _testMode; } public int getTestCount() { return _testCount; } public String getConvertDB() { return _convertDB; } public void setConvertDB(String convertDB) { _convertDB = convertDB; } public String getConvertFile() { return _convertFile; } public void setConvertFile(String convertFile) { _convertFile = convertFile; } public String getConvertElementIn() { return _convertElementIn; } public void setConvertElementIn(String convertElementIn) { _convertElementIn = convertElementIn; } public boolean checkConvertDB() { return _convertDB != null && !_convertDB.equalsIgnoreCase("false") && !_convertDB.equalsIgnoreCase("no") && !_convertDB.equalsIgnoreCase("0"); } public boolean checkConvertFile() { return _convertFile != null && !_convertFile.equalsIgnoreCase("false") && !_convertFile.equalsIgnoreCase("no") && !_convertFile.equalsIgnoreCase("0"); } public boolean checkConvertElementIn() { return _convertElementIn != null && !_convertElementIn.equalsIgnoreCase("false") && !_convertElementIn.equalsIgnoreCase("no") && !_convertElementIn.equalsIgnoreCase("0"); } public String getElementLogging() { return _elementLogging; } public void setElementLogging(String elementLogging) { this._elementLogging = elementLogging; } public boolean checkElementLogging() { return _elementLogging != null && !_elementLogging.equalsIgnoreCase("false") && !_elementLogging.equalsIgnoreCase("no") && !_elementLogging.equalsIgnoreCase("0"); } public boolean checkCreateDummy() { return _createDummy != null && !_createDummy.equalsIgnoreCase("false") && !_createDummy.equalsIgnoreCase("no") && !_createDummy.equalsIgnoreCase("0"); } public DataStore getSourceDataStore() { return sourceDataStore; } protected void createSourceDataStore() throws JobExecutionException { if (sourceDataStore != null) { sourceDataStore.dispose(); sourceDataStore = null; } if (!isDriverFound()) { throw new JobExecutionException("Oracle JDBC Driver not found.-" + JDBC_DRIVER); } Map map = new TreeMap(); map.put("host", _oracleHost); map.put("port", _oraclePort); map.put("instance", _oracleInstance); map.put("user", _username); map.put("passwd", _password); map.put("dbtype", "oracle"); map.put("alias", _oracleInstance); map.put("namespace", null); if (!dataStoreFactory.canProcess(map)) { getLogger().warn("cannot process properties-"); throw new JobExecutionException("cannot process properties-"); } try { sourceDataStore = (OracleDataStore) dataStoreFactory.createDataStore(map); } catch (IOException e) { getLogger().warn(e.getMessage(), e); throw new JobExecutionException(e.getMessage(), e); } } protected void disconnect() { ConnectionPoolManager manager = ConnectionPoolManager.getInstance(); manager.closeAll(); } }