From 974b89a6bf03b6a55defbd4c5043e4d19e4bafab Mon Sep 17 00:00:00 2001 From: Dennis Kao <ulysseskao@ximple.com.tw> Date: Wed, 07 Aug 2013 19:04:40 +0800 Subject: [PATCH] update geoserver config with rest --- xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java | 273 +++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 196 insertions(+), 77 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 c7dac7f..2246470 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 @@ -9,11 +9,10 @@ import it.geosolutions.geoserver.rest.GeoServerRESTManager; 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.*; import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem; import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; +import it.geosolutions.geoserver.rest.encoder.GSLayerGroupEncoder; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; import it.geosolutions.geoserver.rest.encoder.datastore.GSPostGISDatastoreEncoder; import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; @@ -23,6 +22,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.geotools.data.Transaction; +import org.geotools.data.jdbc.JDBCUtils; +import org.geotools.geometry.GeneralEnvelope; import org.opengis.feature.type.FeatureType; import org.opengis.feature.type.GeometryDescriptor; import org.quartz.JobDataMap; @@ -32,7 +33,6 @@ import org.xml.sax.SAXException; import java.io.IOException; -import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -125,7 +125,7 @@ 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"); + (((int) ((tCurrent - tBefore) % 60000.0)) / 1000) + " sec"); } @Override @@ -174,8 +174,9 @@ */ private void resetPostgisViewMapping(JobExecutionContext executionContext) { assert executionContext != null; + Connection connection = null; try { - Connection connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); + connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); String ownerName = _pgUsername; String currentTargetSchema = retrieveCurrentSchemaName(connection, DataReposVersionManager.VSSTATUS_READY); @@ -210,6 +211,8 @@ } catch (SQLException e) { logger.warn(e.getMessage(), e); } finally { + if (connection != null) + JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null); // if (dataStore != null) dataStore.dispose(); } } @@ -513,38 +516,136 @@ return result; } - private void resetFeatureTypesMapping(JobExecutionContext executionContext, GeoServerRESTReader reader) { + private String buildDefaultWMSLayerNames(String namespace, List xgeosConfigs, GSLayerGroupEncoder lgEncoder) { + StringBuilder sbLayers = new StringBuilder(); + boolean first = true; + + for (Object value : xgeosConfigs) { + if (!first) { + sbLayers.append(','); + } else { + first = false; + } + XGeosDataConfig xgeosConfig = (XGeosDataConfig) value; + + StringBuilder sbFullName = new StringBuilder(namespace); + sbFullName.append(':'); + + StringBuilder sbLayerName = new StringBuilder(namespace); + sbLayerName.append("fsc-"); + sbLayerName.append(xgeosConfig.getFSC()).append("-c"); + sbLayerName.append(xgeosConfig.getCOMP()).append("-l"); + sbLayerName.append(xgeosConfig.getLEV()).append("-w"); + sbLayerName.append(xgeosConfig.getWEIGHT()); + String layerName = sbLayerName.toString(); + if (lgEncoder != null) { + lgEncoder.addLayer(layerName); + } + sbFullName.append(layerName); + sbLayers.append(sbFullName.toString()); + } + + return sbLayers.toString(); + } + + protected String[] getTargetStoreTypeNames(Connection connection) { try { + final int TABLE_NAME_COL = 3; + List list = new ArrayList(); + + DatabaseMetaData meta = connection.getMetaData(); + // String[] tableType = { "TABLE", "VIEW" }; + String[] tableType = { "VIEW" }; + ResultSet tables = meta.getTables(null, _pgSchema, "%", tableType); + + while (tables.next()) { + String tableName = tables.getString(TABLE_NAME_COL); + list.add(tableName); + /* + if (allowTable(tableName)) { + list.add(tableName); + } + */ + } + tables.close(); + return (String[]) list.toArray(new String[list.size()]); + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + } + return null; + } + + private void resetFeatureTypesMapping(JobExecutionContext executionContext, GeoServerRESTManager manager) { + try { + GeoServerRESTReader reader = manager.getReader(); + GeoServerRESTPublisher publisher = manager.getPublisher(); + Connection connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); - if (!checkCurrentRepositoryStatus(connection, DataReposVersionManager.VSSTATUS_LINKVIEW)) { + if (!checkCurrentRepositoryStatus(connection, DataReposVersionManager.VSSTATUS_CONFIG)) { return; } + Set<String> styles = new TreeSet<String>(); RESTStyleList styleList = reader.getStyles(); - + for (NameLinkElem style : styleList) { + styles.add(style.getName()); + } + RESTLayerList layers = reader.getLayers(); + for (NameLinkElem layer : layers) { + layer.getName(); + } // Map styles = dataConfig.getStyles(); XGeosDataConfigMapping mapping = getConfigMapping(); HashMap<String, String> defaultStyles = buildDefaultStylesMapping(mapping); try { - /* - String[] dsFTypeNames = dataStore.getTypeNames(); + String[] dsFTypeNames = getTargetStoreTypeNames(connection); for (String featureTypeName : dsFTypeNames) { - String ftKey = dsConf.getId() + DataConfig.SEPARATOR + featureTypeName; - FeatureTypeConfig ftConfig = dataConfig.getFeatureTypeConfig(ftKey); - if (ftConfig == null) { - if (!createFeatureTypeConfig(dataConfig, dsConf, dataStore, styles, featureTypeName, defaultStyles)) { - LOGGER.info("Create Feature Failed. [" + featureTypeName + "]"); + FeatureType featureType = null; + try { + featureType = targetDataStore.getFeatureSource(featureTypeName, Transaction.AUTO_COMMIT).getSchema(); + } catch (IOException e) { + logger.warn(e.getMessage(), e); + } + if (featureType == null) continue; + + RESTLayer layer = reader.getLayer(DEFAULT_NAMESPACE, featureTypeName); + if (layer != null) { + // publisher.removeLayer(DEFAULT_NAMESPACE, featureTypeName); + if (!publisher.unpublishFeatureType(DEFAULT_NAMESPACE, DEFAULT_STORENAME, featureTypeName)) { + logger.info("Cannot remove featureType:" + featureTypeName); } - } else { - updateFeatureTypeConfig(ftConfig, dataStore, styles, defaultStyles); + } + + final GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); + + // fte.setProjectionPolicy(GSResourceEncoder.ProjectionPolicy.REPROJECT_TO_DECLARED); + fte.setProjectionPolicy(GSResourceEncoder.ProjectionPolicy.FORCE_DECLARED); + fte.addKeyword("KEYWORD"); + fte.setTitle(featureTypeName); + fte.setName(featureTypeName); + String srs = "EPSG:" + SRSID_TWD97_ZONE121; + if (!this._useZone121) { + srs = "EPSG:" + SRSID_TWD97_ZONE119; + } + fte.setNativeCRS(srs); + fte.setSRS(srs); // srs=null?"EPSG:4326":srs); + + String defaultStyle = getDefaultFeatureTypeStyleId(styles, defaultStyles, featureType); + final GSLayerEncoder le = new GSLayerEncoder(); + le.setDefaultStyle(defaultStyle); + + if (!publisher.publishDBLayer(DEFAULT_NAMESPACE, DEFAULT_STORENAME, fte, le)) { + logger.info("Create Feature Failed. [" + featureTypeName + "]"); } } - */ } finally { // if (dataStore != null) dataStore.dispose(); + if (connection != null) + JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null); + } } catch (IOException e) { logger.warn(e.getMessage(), e); @@ -552,8 +653,9 @@ } private void resetGeoServerConfig(JobExecutionContext jobExecutionContext) throws JobExecutionException { + Connection connection = null; try { - Connection connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); + connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); transferXGeosVersionStatus(connection, DataReposVersionManager.VSSTATUS_LINKVIEW, DataReposVersionManager.VSSTATUS_CONFIG, false); URL geoServerURL = new URL(_geoServerURL); @@ -587,7 +689,7 @@ } - resetFeatureTypesMapping(jobExecutionContext, reader); + resetFeatureTypesMapping(jobExecutionContext, manager); resetGeoserverWMSConfig(jobExecutionContext, connection, manager, true); resetWMSVirtualLayerMapping(jobExecutionContext, connection, manager, true); @@ -601,25 +703,14 @@ } catch (URISyntaxException e) { logger.warn(e.getMessage(), e); throw new JobExecutionException("resetGeoServerConfig has error-" + e.getMessage(), e); + } finally { + if (connection != null) + JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null); + } } - public boolean publishPostGISLayer(GeoServerRESTPublisher publisher, String workspace, String storename, String layername, String srs, - String defaultStyle) { - - final GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); - - fte.setProjectionPolicy(GSResourceEncoder.ProjectionPolicy.REPROJECT_TO_DECLARED); - fte.addKeyword("KEYWORD"); - fte.setTitle(layername); - fte.setName(layername); - fte.setSRS(srs); // srs=null?"EPSG:4326":srs); - final GSLayerEncoder layerEncoder = new GSLayerEncoder(); - layerEncoder.setDefaultStyle(defaultStyle); - return publisher.publishDBLayer(workspace, storename, fte, layerEncoder); - } - - protected String getDefaultFeatureTypeStyleId(Map styles, HashMap<String, String> defaultStyles, FeatureType featureType) { + protected String getDefaultFeatureTypeStyleId(Set<String> styles, HashMap<String, String> defaultStyles, FeatureType featureType) { String ftName = featureType.getName().getLocalPart(); boolean isNormalFeature = false; boolean isLandBased = false; @@ -648,68 +739,68 @@ if (ftName.indexOf("lnd") != -1) { isLandBased = true; } - /* - if (featureType.find("symbol") != -1) { + if (featureType.getDescriptor("symbol") != null) { isSymbol = true; } - */ if (Point.class.equals(geomType)) { if (isSymbol) { - return retrieveDefaultStyle(styles, "pgTPC_Symbol", "point"); + return retrieveDefaultStyle(styles, "xtpc-symbol", "point"); } else if (isIndex) { - return retrieveDefaultStyle(styles, "pgTPC_TpclidText", "point"); + return retrieveDefaultStyle(styles, "xtpc-text2", "point"); } else { - return retrieveDefaultStyle(styles, "pgTPC_Text", "point"); + return retrieveDefaultStyle(styles, "xtpc-text", "point"); } } else if (LineString.class.equals(geomType)) { if ((!isIndex) && (!isLandBased)) { - return retrieveDefaultStyle(styles, "pgTPC_Conductor", "line"); + return retrieveDefaultStyle(styles, "xtpc-conductor", "line"); } else if (isIndex) { if (isSmallIndex) - return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPES", "line"); + return retrieveDefaultStyle(styles, "xtpc-indexshapes", "line"); - return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPE", "line"); + return retrieveDefaultStyle(styles, "xtpc-indexshape", "line"); } else if (isLandBased) { - return retrieveDefaultStyle(styles, "pgTPC_LndcityLine", "line"); + return retrieveDefaultStyle(styles, "xtpc-lndcityLine", "line"); } } else if (MultiPoint.class.equals(geomType)) { if (isSymbol) { - return retrieveDefaultStyle(styles, "pgTPC_Symbol", "point"); + return retrieveDefaultStyle(styles, "xtpc-symbol", "point"); } else { - return retrieveDefaultStyle(styles, "pgTPC_Text", "point"); + return retrieveDefaultStyle(styles, "xtpc-text", "point"); } } else if (Polygon.class.equals(geomType)) { - if ((!isIndex) && (!isLandBased)) { + if (isSymbol) { + return retrieveDefaultStyle(styles, "xtpc-symbol", "polygon"); + } else if ((!isIndex) && (!isLandBased)) { return retrieveDefaultStyle(styles, "polygon", "polygon"); } else if (isIndex) { - return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPE", "polygon"); + return retrieveDefaultStyle(styles, "xtpc-indexshape", "polygon"); } else if (isLandBased) { - return retrieveDefaultStyle(styles, "pgTPC_LndcityPolygon", "polygon"); + return retrieveDefaultStyle(styles, "xtpc-lndcityPolygon", "polygon"); } } else if (LinearRing.class.equals(geomType)) { if (!isIndex) { return retrieveDefaultStyle(styles, "polygon", "polygon"); } else { - return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPE", "polygon"); + return retrieveDefaultStyle(styles, "xtpc-indexshape", "polygon"); } } else if (MultiLineString.class.equals(geomType)) { if ((!isIndex) && (!isLandBased)) { - return retrieveDefaultStyle(styles, "pgTPC_Conductor", "line"); + return retrieveDefaultStyle(styles, "xtpc-conductor", "line"); } else if (isLandBased) { - return retrieveDefaultStyle(styles, "pgTPC_LndcityLine", "line"); + return retrieveDefaultStyle(styles, "xtpc-lndcityLine", "line"); } else { - return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPE", "line"); + return retrieveDefaultStyle(styles, "xtpc-indexshape", "line"); } } else if (MultiPolygon.class.equals(geomType)) { return "polygon"; } - return "pgTPC_Symbol"; + return "xtpc-symbol"; } - private static String retrieveDefaultStyle(Map styles, String styleName, String defaultStyleName) { - if (styles.containsKey(styleName)) { + private static String retrieveDefaultStyle(Set styles, String styleName, String defaultStyleName) { + if (styles.contains(styleName)) { return styleName; } else return defaultStyleName; @@ -724,6 +815,8 @@ } GeoServerRESTReader reader = manager.getReader(); + GeoServerRESTPublisher publisher = manager.getPublisher(); + RESTLayerList layers = reader.getLayers(); ArrayList<String> baseMapNames = new ArrayList<String>(); @@ -750,17 +843,28 @@ defaultMapNames.remove(index); List configs = (List) configMapping.getMapping().get(baseMapTitle); - String defaultLayerNames = buildDefaultWMSLayerNames(DEFAULTNAMESPACE, configs); - wmsConfig.getBaseMapLayers().put(baseMapTitle, defaultLayerNames); + String defaultLayerNames = buildDefaultWMSLayerNames(DEFAULT_NAMESPACE, configs, null); + // wmsConfig.getBaseMapLayers().put(baseMapTitle, defaultLayerNames); + logger.info(baseMapTitle + ":" + defaultLayerNames); } else { - logger.warn("lv='" + baseMapTitle + "' cannot found config information in XGeosDataConfigMapping."); + logger.warn(key.toString() + "-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); + GSLayerGroupEncoder lge = new GSLayerGroupEncoder(); + String defaultLayerNames = buildDefaultWMSLayerNames(DEFAULT_NAMESPACE, configs, lge); + logger.info(key + ":" + defaultLayerNames); + // wmsConfig.getBaseMapLayers().put(key, defaultLayerNames); + String layerGroupName = key.toString(); + RESTLayerGroup layerGroup = reader.getLayerGroup(DEFAULT_NAMESPACE, layerGroupName); + if (layerGroup == null) { + publisher.createLayerGroup(DEFAULT_NAMESPACE, layerGroupName, lge); + } else { + publisher.configureLayerGroup(DEFAULT_NAMESPACE, layerGroupName, lge); + + } } } @@ -774,32 +878,43 @@ GeoServerRESTReader reader = manager.getReader(); RESTLayerList layers = reader.getLayers(); - Map baseMapLayers = wmsConfig.getBaseMapLayers(); - Map baseMapEnvelopes = wmsConfig.getBaseMapEnvelopes(); - ArrayList baseMapNames = new ArrayList(baseMapLayers.keySet()); + // Map baseMapLayers = wmsConfig.getBaseMapLayers(); + // Map baseMapEnvelopes = wmsConfig.getBaseMapEnvelopes(); + ArrayList<String> baseMapNames = new ArrayList<String>(); + for (NameLinkElem elm : layers) { + baseMapNames.add(elm.getName()); + } for (Object key : baseMapNames) { String baseMapTitle = (String) key; if (baseMapTitle.startsWith("pg")) { - GeneralEnvelope envelope = (GeneralEnvelope) baseMapEnvelopes.get(baseMapTitle); + // GeneralEnvelope envelope = (GeneralEnvelope) baseMapEnvelopes.get(baseMapTitle); GeneralEnvelope selectedEnvelope = null; - String baseLayersValue = (String) wmsConfig.getBaseMapLayers().get(baseMapTitle); - String[] layerNames = null; + // String baseLayersValue = (String) wmsConfig.getBaseMapLayers().get(baseMapTitle); + RESTLayerGroup layerGroup = reader.getLayerGroup(DEFAULT_NAMESPACE, baseMapTitle); + String baseLayersValue = layerGroup.getName(); + String[] layerNames = null; if (baseLayersValue != null) { layerNames = baseLayersValue.split(","); } else { - LOGGER.info("vl='" + baseMapTitle + "' is empty value."); + logger.info("vl='" + baseMapTitle + "' is empty value."); continue; } + + // RESTLayer layer = reader.getLayer(DEFAULT_NAMESPACE, baseMapTitle); + // layer.Type. ArrayList<String> newLayerNames = new ArrayList<String>(); for (int i = 0; i < layerNames.length; i++) { String layerName = layerNames[i].trim(); + newLayerNames.add(layerName); + /* 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 @@ -818,7 +933,7 @@ return; } } catch (IOException e) { - LOGGER.log(Level.WARNING, e.getMessage(), e); + logger.warn(e.getMessage(), e); return; } @@ -843,13 +958,13 @@ return; } } catch (TransformException e) { - LOGGER.log(Level.WARNING, e.getMessage(), e); + logger.warn(e.getMessage(), e); return; } catch (FactoryException e) { - LOGGER.log(Level.WARNING, e.getMessage(), e); + logger.warn(e.getMessage(), e); return; } catch (IOException e) { - LOGGER.log(Level.WARNING, e.getMessage(), e); + logger.warn(e.getMessage(), e); return; } @@ -869,8 +984,9 @@ } } } else { - LOGGER.warning("Cannot found layer " + layerName + " in " + baseMapTitle); + logger.warn("Cannot found layer " + layerName + " in " + baseMapTitle); } + */ } if (layerNames.length != newLayerNames.size()) { @@ -882,9 +998,11 @@ } else bFirst = false; layerBuilder.append(newlayerName); } - baseMapLayers.put(baseMapTitle, layerBuilder.toString()); + // baseMapLayers.put(baseMapTitle, layerBuilder.toString()); + logger.info(baseMapTitle +":"+ layerBuilder.toString()); } + /* if (selectedEnvelope != null) { if (envelope != null) { envelope.setCoordinateReferenceSystem(selectedEnvelope @@ -895,6 +1013,7 @@ baseMapEnvelopes.put(baseMapTitle, selectedEnvelope); } } + */ } } } -- Gitblit v0.0.0-SNAPSHOT