From 136cf5e879f9cf9985a60fb94d40e1b0b833e140 Mon Sep 17 00:00:00 2001 From: Dennis Kao <ulysseskao@gmail.com> Date: Wed, 07 Aug 2013 09:53:13 +0800 Subject: [PATCH] update geoserver config with rest --- xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java | 280 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 243 insertions(+), 37 deletions(-) diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java index 2391245..c7dac7f 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java @@ -10,7 +10,9 @@ import it.geosolutions.geoserver.rest.GeoServerRESTPublisher; import it.geosolutions.geoserver.rest.GeoServerRESTReader; import it.geosolutions.geoserver.rest.decoder.RESTDataStore; +import it.geosolutions.geoserver.rest.decoder.RESTLayerList; import it.geosolutions.geoserver.rest.decoder.RESTStyleList; +import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem; import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; import it.geosolutions.geoserver.rest.encoder.datastore.GSPostGISDatastoreEncoder; @@ -35,10 +37,8 @@ import java.net.URISyntaxException; import java.net.URL; import java.sql.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.Date; public class GeoserverIntegrateConfigJob extends OracleConvertDgn2PostGISJob { final static Log logger = LogFactory.getLog(GeoserverIntegrateConfigJob.class); @@ -123,6 +123,11 @@ return xgeosDataConfigMapping; } + private void logTimeDiff(String message, long tBefore, long tCurrent) { + logger.warn(message + ":use time = " + ((int) ((tCurrent - tBefore) / 60000.0)) + " min - " + + (((int) ((tCurrent - tBefore) % 60000.0)) / 1000) + " sec"); + } + @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { @@ -143,8 +148,20 @@ String targetSchemaName; try { + logger.info("-- step:resetPostgisViewMapping --"); + long tStep = System.currentTimeMillis(); resetPostgisViewMapping(jobExecutionContext); + if (isProfileMode()) { + long tStepEnd = System.currentTimeMillis(); + logTimeDiff("Profile-resetPostgisViewMapping", tStep, tStepEnd); + } + logger.info("-- step:resetGeoServerConfig --"); + tStep = System.currentTimeMillis(); resetGeoServerConfig(jobExecutionContext); + if (isProfileMode()) { + long tStepEnd = System.currentTimeMillis(); + logTimeDiff("Profile-resetGeoServerConfig", tStep, tStepEnd); + } } finally { disconnect(); } @@ -406,22 +423,6 @@ } } - /* - 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); @@ -453,6 +454,32 @@ } finally { if (rs != null) rs.close(); if (stmt != null) stmt.close(); + } + } + + protected void transferXGeosVersionStatus(Connection connection, + short vsstatusBefore, short vsstatusAfter, boolean exclusive) throws JobExecutionException { + + try { + String currentTargetSchema = retrieveCurrentSchemaName(connection, vsstatusBefore); + if (currentTargetSchema == null) { + logger.info("Cannot found target schema in dataStore."); + return; + } + String existTargetSchema = null; + if (exclusive) + existTargetSchema = retrieveCurrentSchemaName(connection, vsstatusAfter); + + + updateCurrentRepositoryStatus(connection, currentTargetSchema, vsstatusAfter); + if ((exclusive) && (existTargetSchema != null)) { + updateCurrentRepositoryStatus(connection, existTargetSchema, + DataReposVersionManager.VSSTATUS_AVAILABLE); + } + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + throw new JobExecutionException("Update " + DataReposVersionManager.XGVERSIONTABLE_NAME + + " has error-", e); } } @@ -524,8 +551,11 @@ } } - private void resetGeoServerConfig(JobExecutionContext jobExecutionContext) { + private void resetGeoServerConfig(JobExecutionContext jobExecutionContext) throws JobExecutionException { try { + Connection connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); + transferXGeosVersionStatus(connection, DataReposVersionManager.VSSTATUS_LINKVIEW, + DataReposVersionManager.VSSTATUS_CONFIG, false); URL geoServerURL = new URL(_geoServerURL); GeoServerRESTManager manager = new GeoServerRESTManager(geoServerURL, _geoServerUser, _geoServerPass); GeoServerRESTReader reader = manager.getReader(); @@ -559,26 +589,18 @@ resetFeatureTypesMapping(jobExecutionContext, reader); - 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; + resetGeoserverWMSConfig(jobExecutionContext, connection, manager, true); + resetWMSVirtualLayerMapping(jobExecutionContext, connection, manager, true); - /* - publishPostGISLayer(publisher, DEFAULT_NAMESPACE, DEFAULT_STORENAME, - xgeosConfig.getPG(), - "EPSG:" + SRSID_TWD97_ZONE121, ""); - */ - } - } - - - } catch (MalformedURLException e) { + transferXGeosVersionStatus(connection, DataReposVersionManager.VSSTATUS_CONFIG, + DataReposVersionManager.VSSTATUS_USING, true); + Date lastUpdate = Calendar.getInstance().getTime(); + } catch (IOException e) { logger.warn(e.getMessage(), e); + throw new JobExecutionException("resetGeoServerConfig has error-" + e.getMessage(), e); } catch (URISyntaxException e) { logger.warn(e.getMessage(), e); + throw new JobExecutionException("resetGeoServerConfig has error-" + e.getMessage(), e); } } @@ -693,4 +715,188 @@ return defaultStyleName; } + protected void resetGeoserverWMSConfig(JobExecutionContext executionContext, Connection connection, + GeoServerRESTManager manager, boolean masterMode) + throws JobExecutionException, IOException { + + if ((masterMode) && (!checkCurrentRepositoryStatus(connection, DataReposVersionManager.VSSTATUS_CONFIG))) { + return; + } + + GeoServerRESTReader reader = manager.getReader(); + RESTLayerList layers = reader.getLayers(); + + ArrayList<String> baseMapNames = new ArrayList<String>(); + for (NameLinkElem elm : layers) { + baseMapNames.add(elm.getName()); + } + + XGeosDataConfigMapping configMapping = getConfigMapping(); + if (configMapping.getMapping().isEmpty()) { + logger.warn("XGeosDataConfigMapping is empty! Pleace check XGeosDataConfig file."); + return; + } + + LinkedList defaultMapNames = new LinkedList(configMapping.getMapping().keySet()); + if (defaultMapNames.isEmpty()) { + logger.warn("DefaultMapNames is emptyin XGeosDataConfigMapping! Pleace check XGeosDataConfig file."); + } + + for (Object key : baseMapNames) { + String baseMapTitle = (String) key; + if (configMapping.getMapping().containsKey(baseMapTitle)) { + int index = defaultMapNames.indexOf(baseMapTitle); + if (index != -1) + defaultMapNames.remove(index); + + List configs = (List) configMapping.getMapping().get(baseMapTitle); + String defaultLayerNames = buildDefaultWMSLayerNames(DEFAULTNAMESPACE, configs); + wmsConfig.getBaseMapLayers().put(baseMapTitle, defaultLayerNames); + } else { + logger.warn("lv='" + baseMapTitle + "' cannot found config information in XGeosDataConfigMapping."); + } + } + + for (Object key : defaultMapNames) { + List configs = (List) configMapping.getMapping().get(key); + String defaultLayerNames = buildDefaultWMSLayerNames(DEFAULTNAMESPACE, configs); + wmsConfig.getBaseMapLayers().put(key, defaultLayerNames); + } + } + + private void resetWMSVirtualLayerMapping(JobExecutionContext jobExecutionContext, Connection connection, + GeoServerRESTManager manager, boolean masterMode) + throws JobExecutionException, IOException { + if ((masterMode) && (!checkCurrentRepositoryStatus(connection, DataReposVersionManager.VSSTATUS_CONFIG))) { + return; + } + + GeoServerRESTReader reader = manager.getReader(); + RESTLayerList layers = reader.getLayers(); + + Map baseMapLayers = wmsConfig.getBaseMapLayers(); + Map baseMapEnvelopes = wmsConfig.getBaseMapEnvelopes(); + ArrayList baseMapNames = new ArrayList(baseMapLayers.keySet()); + + for (Object key : baseMapNames) { + String baseMapTitle = (String) key; + if (baseMapTitle.startsWith("pg")) { + GeneralEnvelope envelope = (GeneralEnvelope) baseMapEnvelopes.get(baseMapTitle); + + GeneralEnvelope selectedEnvelope = null; + String baseLayersValue = (String) wmsConfig.getBaseMapLayers().get(baseMapTitle); + String[] layerNames = null; + if (baseLayersValue != null) { + layerNames = baseLayersValue.split(","); + } else { + LOGGER.info("vl='" + baseMapTitle + "' is empty value."); + continue; + } + + ArrayList<String> newLayerNames = new ArrayList<String>(); + for (int i = 0; i < layerNames.length; i++) { + String layerName = layerNames[i].trim(); + + Integer layerType = catalog.getLayerType(layerName); + if (layerType != null) { + newLayerNames.add(layerName); + if (layerType.intValue() == MapLayerInfo.TYPE_VECTOR) { + FeatureTypeInfo ftype = catalog.getFeatureTypeInfo(layerName); + ftype = ((ftype != null) ? ftype + : catalog.getFeatureTypeInfo(layerName + .substring(layerName.indexOf(":") + 1, layerName.length()))); + + if (selectedEnvelope == null) { + ReferencedEnvelope ftEnvelope = null; + + try { + if (ftype.getBoundingBox() instanceof ReferencedEnvelope + && !ftype.getBoundingBox().isNull()) { + ftEnvelope = ftype.getBoundingBox(); + } else { + // TODO Add Action Errors + return; + } + } catch (IOException e) { + LOGGER.log(Level.WARNING, e.getMessage(), e); + return; + } + + selectedEnvelope = new GeneralEnvelope(new double[]{ + ftEnvelope.getMinX(), ftEnvelope.getMinY() + }, + new double[]{ftEnvelope.getMaxX(), ftEnvelope.getMaxY()}); + selectedEnvelope.setCoordinateReferenceSystem(ftEnvelope + .getCoordinateReferenceSystem()); + } else { + final CoordinateReferenceSystem dstCRS = selectedEnvelope + .getCoordinateReferenceSystem(); + + ReferencedEnvelope ftEnvelope = null; + + try { + if (ftype.getBoundingBox() instanceof ReferencedEnvelope) { + ftEnvelope = (ReferencedEnvelope) ftype.getBoundingBox(); + ftEnvelope.transform(dstCRS, true); + } else { + // TODO Add Action Errors + return; + } + } catch (TransformException e) { + LOGGER.log(Level.WARNING, e.getMessage(), e); + return; + } catch (FactoryException e) { + LOGGER.log(Level.WARNING, e.getMessage(), e); + return; + } catch (IOException e) { + LOGGER.log(Level.WARNING, e.getMessage(), e); + return; + } + + ReferencedEnvelope newEnvelope = new ReferencedEnvelope(dstCRS); + newEnvelope.init(selectedEnvelope.getLowerCorner().getOrdinate(0), + selectedEnvelope.getUpperCorner().getOrdinate(0), + selectedEnvelope.getLowerCorner().getOrdinate(1), + selectedEnvelope.getUpperCorner().getOrdinate(1)); + + newEnvelope.expandToInclude(ftEnvelope); + + selectedEnvelope = new GeneralEnvelope(new double[]{ + newEnvelope.getMinX(), newEnvelope.getMinY() + }, + new double[]{newEnvelope.getMaxX(), newEnvelope.getMaxY()}); + selectedEnvelope.setCoordinateReferenceSystem(dstCRS); + } + } + } else { + LOGGER.warning("Cannot found layer " + layerName + " in " + baseMapTitle); + } + } + + if (layerNames.length != newLayerNames.size()) { + StringBuilder layerBuilder = new StringBuilder(); + boolean bFirst = true; + for (String newlayerName : newLayerNames) { + if (!bFirst) { + layerBuilder.append(','); + } else bFirst = false; + layerBuilder.append(newlayerName); + } + baseMapLayers.put(baseMapTitle, layerBuilder.toString()); + } + + if (selectedEnvelope != null) { + if (envelope != null) { + envelope.setCoordinateReferenceSystem(selectedEnvelope + .getCoordinateReferenceSystem()); + envelope.setEnvelope(selectedEnvelope); + baseMapEnvelopes.put(baseMapTitle, envelope); + } else { + baseMapEnvelopes.put(baseMapTitle, selectedEnvelope); + } + } + } + } + } + } -- Gitblit v0.0.0-SNAPSHOT