From 617bff91fba317f36740ecdecc7ae6b699afbd80 Mon Sep 17 00:00:00 2001 From: Dennis Kao <ulysseskao@ximple.com.tw> Date: Thu, 01 Aug 2013 18:48:31 +0800 Subject: [PATCH] add reset geoserver config --- xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverResetConfigJob.java | 425 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 417 insertions(+), 8 deletions(-) diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverResetConfigJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverResetConfigJob.java index 7d30aff..d0881c6 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverResetConfigJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverResetConfigJob.java @@ -1,11 +1,420 @@ package com.ximple.eofms.jobs; -/** - * Created with IntelliJ IDEA. - * User: ulysseskao - * Date: 2013/8/1 - * Time: 下午 2:47 - * To change this template use File | Settings | File Templates. - */ -public class GeoserverResetConfigJob { +import com.ximple.eofms.geoserver.config.XGeosDataConfig; +import com.ximple.eofms.geoserver.config.XGeosDataConfigMapping; +import com.ximple.eofms.util.PrintfFormat; +import it.geosolutions.geoserver.rest.GeoServerRESTManager; +import it.geosolutions.geoserver.rest.GeoServerRESTPublisher; +import it.geosolutions.geoserver.rest.GeoServerRESTReader; +import it.geosolutions.geoserver.rest.manager.GeoServerRESTStoreManager; +import org.apache.commons.collections.MultiMap; +import org.apache.commons.digester3.Digester; +import org.apache.commons.digester3.binder.DigesterLoader; +import org.apache.commons.digester3.xmlrules.FromXmlRulesModule; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.geotools.data.DataStore; +import org.geotools.data.edbgeo.PostgisDataStore; +import org.geotools.data.postgis.PostGISDialect; +import org.geotools.jdbc.JDBCDataStore; +import org.geotools.jdbc.SQLDialect; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.xml.sax.SAXException; + +import javax.naming.ConfigurationException; +import javax.sql.DataSource; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.sql.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class GeoserverResetConfigJob extends OracleConvertDgn2PostGISJob { + final static Log logger = LogFactory.getLog(GeoserverResetConfigJob.class); + + private static final String SKIPCONFIGJOB = "SKIPCONFIGJOB"; + private static final String MASTERMODE = "MASTERMODE"; + private static final String EPSG = "EPSG:"; + private static final String DEFAULTNAMESPACE = "tpc"; + private static final String XGEOSDATACONFIG_PATH = "xgeosdataconfig.xml"; + private static final String XGEOSRULES_NAME = "DefaultXGeosDataConfigRules.xml"; + + // private static final int MAGIC_BLOCKSIZE = (64 * 1024 * 1024) - (32 * 1024); + + private static final String QUERY_VIEWDEFSQL = "SELECT table_name, view_definition FROM information_schema.views " + + "WHERE table_schema = ? AND table_name LIKE "; + + private static final String CREATE_VIEWSQL = "CREATE OR REPLACE VIEW \"%s\" AS SELECT * FROM \"%s\".\"%s\""; + private static final String EXTRAWHERE_VIEWSQL = " WHERE \"%s\".level = %s AND \"%s\".symweight = %s"; + + private static final String ALTER_VIEWSQL = "ALTER TABLE \"%s\" OWNER TO "; + // private static final String GRANT_VIEWSQL = "GRANT SELECT ON TABLE \"%s\" TO public"; + private static final int SRSID_TWD97_ZONE119 = 3825; + private static final int SRSID_TWD97_ZONE121 = 3826; + + private static XGeosDataConfigMapping xgeosDataConfigMapping = null; + + protected XGeosDataConfigMapping getConfigMapping() { + if (xgeosDataConfigMapping == null) { + final URL rulesURL = XGeosDataConfigMapping.class.getResource(XGEOSRULES_NAME); + assert rulesURL != null; + /* + FromXmlRulesModule rules = new FromXmlRulesModule() { + @Override + protected void loadRules() { + this.loadXMLRules(rulesURL); + } + }; + + Digester digester = DigesterLoader.newLoader(rules).newDigester(); + */ + + /* + File rootDir = GeoserverDataDirectory.getGeoserverDataDirectory(); + File xfmsConfigDir; + + try { + xfmsConfigDir = GeoserverDataDirectory.findConfigDir(rootDir, "xdgnjobs"); + } catch (ConfigurationException cfe) { + logger.warn("no xmark dir found, creating new one"); + //if for some bizarre reason we don't fine the dir, make a new one. + xfmsConfigDir = new File(rootDir, "xdgnjobs"); + } + + File xfmsConfigFile = new File(xfmsConfigDir, XGEOSDATACONFIG_PATH); + try { + xgeosDataConfigMapping = (XGeosDataConfigMapping) digester.parse(xfmsConfigFile); + } catch (IOException e) { + logger.warn(e.getMessage(), e); + } catch (SAXException e) { + logger.warn(e.getMessage(), e); + } + */ + } + return xgeosDataConfigMapping; + } + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + super.execute(jobExecutionContext); + GeoServerRESTReader reader; + GeoServerRESTManager manager; + GeoServerRESTPublisher publisher; + } + + /** + * 重新建立所有重新建立所有PostGIS中的資料庫視景 + * + * @param executionContext 批次執行的關係 + * @param dataStore Geoserver的資料儲存連結 + * @param ownerName 資料庫視景擁有者名稱 + */ + private void resetPostgisViewMapping(JobExecutionContext executionContext, SQLDialect dataStore, String ownerName) { + assert executionContext != null; + try { + if (dataStore instanceof PostGISDialect) { + PostGISDialect pgDataStore = (PostGISDialect) dataStore; + // DataSource dataSource = pgDataStore.getDataSource(); + // Connection connection = dataSource.getConnection(); + Connection connection = null; + String currentTargetSchema = retrieveCurrentSchemaName(connection, + DataReposVersionManager.VSSTATUS_READY); + if (currentTargetSchema == null) { + logger.info("Cannot found schema that status is VSSTATUS_READY[" + + DataReposVersionManager.VSSTATUS_READY + "]"); + return; + } + + ArrayList<String> realTableNames = new ArrayList<String>(); + retrieveAllRealTableName(connection, currentTargetSchema, realTableNames); + + HashMap<String, String> viewDefs = retrieveViewDef(connection, "public", "fsc%"); + HashMap<String, String> tempViewDefs = retrieveViewDef(connection, "public", "indexshape%"); + viewDefs.putAll(tempViewDefs); + tempViewDefs = viewDefs = retrieveViewDef(connection, "public", "lndtpc%"); + viewDefs.putAll(tempViewDefs); + + for (String tableName : realTableNames) { + resetPostgisDataView(connection, viewDefs, ownerName, currentTargetSchema, tableName); + } + + resetExtraPostgisDataView(connection, ownerName, currentTargetSchema, realTableNames); + + updateCurrentRepositoryStatus(connection, currentTargetSchema, + DataReposVersionManager.VSSTATUS_LINKVIEW); + + // String[] featureNames = dataStore.getTypeNames(); + // logger.info("featureNames[] size = " + featureNames.length); + } + // } catch (IOException e) { + // logger.warn(e.getMessage(), e); + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + } finally { + // if (dataStore != null) dataStore.dispose(); + } + } + + private void retrieveAllRealTableName(Connection connection, String targetSchema, + ArrayList<String> realTableNames) throws SQLException { + ResultSet rsMeta = null; + try { + rsMeta = connection.getMetaData().getTables("", targetSchema, "fsc%", new String[]{"TABLE"}); + while (rsMeta.next()) { + String tableName = rsMeta.getString(3); + realTableNames.add(tableName); + } + rsMeta.close(); + rsMeta = null; + + rsMeta = connection.getMetaData().getTables("", targetSchema, "index%", new String[]{"TABLE"}); + while (rsMeta.next()) { + String tableName = rsMeta.getString(3); + realTableNames.add(tableName); + } + rsMeta.close(); + rsMeta = null; + + rsMeta = connection.getMetaData().getTables("", targetSchema, "lndtpc%", new String[]{"TABLE"}); + while (rsMeta.next()) { + String tableName = rsMeta.getString(3); + realTableNames.add(tableName); + } + } finally { + if (rsMeta != null) rsMeta.close(); + } + } + + private void resetPostgisDataView(Connection connection, HashMap<String, String> viewDefs, + String ownerName, String schemaName, String tableName) throws SQLException { + String[] splits = tableName.split("-"); + if (splits.length > 3) { + // feature table + + StringBuilder viewBuilder = new StringBuilder(); + viewBuilder.append(splits[0]); + viewBuilder.append('-'); + viewBuilder.append(splits[1]); + viewBuilder.append('-'); + viewBuilder.append(splits[2]); + viewBuilder.append(splits[3]); + String viewName = viewBuilder.toString(); + if (viewDefs.containsKey(viewName)) { + String viewDef = viewDefs.get(viewName); + int pos = viewDef.indexOf("FROM"); + String subView = viewDef.substring(pos + 4); + // String[] viewSources = subView.split("\\."); + String[] viewSources = subView.split("(\\.\"|\")"); + if (!viewSources[0].equalsIgnoreCase(schemaName)) { + createOrReplaceView(connection, schemaName, tableName, viewName, ownerName); + } + } else { + createOrReplaceView(connection, schemaName, tableName, viewName, ownerName); + } + + } else { + + splits = tableName.split("_"); + if (splits.length > 0) { + StringBuilder viewBuilder = new StringBuilder(); + viewBuilder.append(splits[0]); + if (splits.length > 1) viewBuilder.append(splits[1]); + if (splits.length > 2) viewBuilder.append(splits[2]); + String viewName = viewBuilder.toString(); + if (viewDefs.containsKey(viewName)) { + String viewDef = viewDefs.get(viewName); + int pos = viewDef.indexOf("FROM"); + String subView = viewDef.substring(pos + 4); + String[] viewSources = subView.split("(\\.\"|\")"); + if (!viewSources[0].equalsIgnoreCase(schemaName)) { + createOrReplaceView(connection, schemaName, tableName, viewName, ownerName); + } + } else { + createOrReplaceView(connection, schemaName, tableName, viewName, ownerName); + } + } + } + } + + private void resetExtraPostgisDataView(Connection connection, String ownerName, String currentSchema, + ArrayList<String> realTableNames) { + try { + // ArrayList<String> extraViewNames = new ArrayList<String>(); + XGeosDataConfigMapping configMapping = getConfigMapping(); + MultiMap configMultiMap = configMapping.getMapping(); + for (Object key : configMultiMap.keySet()) { + List values = (List) configMultiMap.get(key); + for (Object value : values) { + XGeosDataConfig xgeosConfig = (XGeosDataConfig) value; + short tid = xgeosConfig.getFSC(); + short cid = xgeosConfig.getCOMP(); + StringBuilder sbTable = new StringBuilder("fsc-"); + sbTable.append(tid).append("-c-"); + sbTable.append(cid); + int index = realTableNames.indexOf(sbTable.toString()); + if (index == -1) { + logger.debug("Cannot found-" + xgeosConfig.toString()); + continue; + } + StringBuilder sbView = new StringBuilder("fsc-"); + sbView.append(tid).append("-c"); + sbView.append(cid).append("-l"); + sbView.append(xgeosConfig.getLEV()).append("-w"); + sbView.append(xgeosConfig.getWEIGHT()); + // extraViewNames.add(sbView.toString()); + + createOrReplaceExtraView(connection, currentSchema, sbTable.toString(), sbView.toString(), + ownerName, xgeosConfig); + } + } + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + } + } + + private HashMap<String, String> retrieveViewDef(Connection connection, String schemaName, String tablePattern) throws SQLException { + PreparedStatement stmt = connection.prepareStatement(QUERY_VIEWDEFSQL + "'" + tablePattern + "'"); + stmt.setString(1, schemaName); + // stmt.setString(2, tablePattern); + HashMap<String, String> result = new HashMap<String, String>(); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + String tableName = rs.getString(1); + String viewDef = rs.getString(2); + result.put(tableName, viewDef); + } + rs.close(); + stmt.close(); + return result; + } + + private void createOrReplaceView(Connection connection, String schemaName, String tableName, String viewName, + String ownerName) throws SQLException { + PrintfFormat pf = new PrintfFormat(CREATE_VIEWSQL); + String sql = pf.sprintf(new Object[]{viewName, schemaName, tableName}); + Statement stmt = connection.createStatement(); + stmt.execute(sql); + + pf = new PrintfFormat(ALTER_VIEWSQL + ownerName); + sql = pf.sprintf(viewName); + stmt.execute(sql); + stmt.close(); + connection.commit(); + } + + private void createOrReplaceExtraView(Connection connection, String schemaName, String tableName, String viewName, + String ownerName, XGeosDataConfig xgeosConfig) throws SQLException { + PrintfFormat pf = new PrintfFormat(CREATE_VIEWSQL); + String sql = pf.sprintf(new Object[]{viewName, schemaName, tableName}); + + PrintfFormat pfWhere = new PrintfFormat(EXTRAWHERE_VIEWSQL); + sql += pfWhere.sprintf(new String[]{tableName, Short.toString(xgeosConfig.getLEV()), + tableName, Short.toString(xgeosConfig.getWEIGHT())}); + + Statement stmt = connection.createStatement(); + stmt.execute(sql); + + pf = new PrintfFormat(ALTER_VIEWSQL + ownerName); + sql = pf.sprintf(viewName); + stmt.execute(sql); + stmt.close(); + connection.commit(); + } + + private Timestamp retrieveCurrentSchemaTimestamp(Connection connection, short status) throws SQLException { + StringBuilder sbSQL = new StringBuilder("SELECT vstimestamp, vsschema, vsstatus FROM "); + sbSQL.append(DataReposVersionManager.XGVERSIONTABLE_NAME); + sbSQL.append(" WHERE vsstatus = "); + sbSQL.append(status); + sbSQL.append(" ORDER BY vsid"); + + Timestamp result = null; + Statement stmt = null; + ResultSet rs = null; + + try { + stmt = connection.createStatement(); + rs = stmt.executeQuery(sbSQL.toString()); + // get first result + if (rs.next()) { + result = rs.getTimestamp(1); + } + return result; + } finally { + if (rs != null) rs.close(); + if (stmt != null) stmt.close(); + } + } + + private void updateCurrentRepositoryStatus(Connection connection, String schemaName, short newStatus) + throws SQLException { + StringBuilder sbSQL = new StringBuilder("UPDATE "); + sbSQL.append(DataReposVersionManager.XGVERSIONTABLE_NAME).append(' '); + sbSQL.append(" SET vsstatus = "); + sbSQL.append(newStatus); + sbSQL.append(", vstimestamp = CURRENT_TIMESTAMP WHERE vsschema = '"); + sbSQL.append(schemaName).append("'"); + + Statement stmt = null; + try { + stmt = connection.createStatement(); + stmt.executeUpdate(sbSQL.toString()); + } finally { + if (stmt != null) stmt.close(); + } + } + + /* + private boolean checkCurrentRepositoryStatus(DataStore dataStore, short status) { + try { + if (dataStore instanceof PostgisDataStore) { + PostgisDataStore pgDataStore = (PostgisDataStore) dataStore; + DataSource dataSource = pgDataStore.getDataSource(); + Connection connection = dataSource.getConnection(); + return checkCurrentRepositoryStatus(connection, status); + } + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + } + return false; + } + */ + + private boolean checkCurrentRepositoryStatus(Connection connection, short status) { + try { + return (retrieveCurrentSchemaName(connection, status) != null); + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + return false; + } + } + + private String retrieveCurrentSchemaName(Connection connection, short status) throws SQLException { + StringBuilder sbSQL = new StringBuilder("SELECT vsschema, vstimestamp, vsstatus FROM "); + sbSQL.append(DataReposVersionManager.XGVERSIONTABLE_NAME); + sbSQL.append(" WHERE vsstatus = "); + sbSQL.append(status); + sbSQL.append(" ORDER BY vsid"); + + String result = null; + Statement stmt = null; + ResultSet rs = null; + + try { + stmt = connection.createStatement(); + rs = stmt.executeQuery(sbSQL.toString()); + // get first result + if (rs.next()) { + result = rs.getString(1); + } + return result; + } finally { + if (rs != null) rs.close(); + if (stmt != null) stmt.close(); + } + } } -- Gitblit v0.0.0-SNAPSHOT