From aff20544466124f3a84fac0b6714fba5b609b291 Mon Sep 17 00:00:00 2001
From: Dennis Kao <ulysseskao@ximple.com.tw>
Date: Tue, 06 Aug 2013 19:34:01 +0800
Subject: [PATCH] update geoserver config with rest

---
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java |  260 ++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 210 insertions(+), 50 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 7eab711..2391245 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
@@ -1,22 +1,28 @@
 package com.ximple.eofms.jobs;
 
+import com.vividsolutions.jts.geom.*;
 import com.ximple.eofms.geoserver.config.XGeosDataConfig;
 import com.ximple.eofms.geoserver.config.XGeosDataConfigMapping;
 import com.ximple.eofms.jobs.context.AbstractOracleJobContext;
 import com.ximple.eofms.util.PrintfFormat;
+import com.ximple.eofms.util.XGeosConfigDigesterUtils;
 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.RESTStyleList;
+import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder;
+import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder;
 import it.geosolutions.geoserver.rest.encoder.datastore.GSPostGISDatastoreEncoder;
+import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder;
 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.Transaction;
+import org.opengis.feature.type.FeatureType;
+import org.opengis.feature.type.GeometryDescriptor;
 import org.quartz.JobDataMap;
 import org.quartz.JobDetail;
 import org.quartz.JobExecutionContext;
@@ -32,6 +38,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class GeoserverIntegrateConfigJob extends OracleConvertDgn2PostGISJob {
     final static Log logger = LogFactory.getLog(GeoserverIntegrateConfigJob.class);
@@ -39,9 +46,8 @@
     private static final String SKIPCONFIGJOB = "SKIPCONFIGJOB";
     private static final String MASTERMODE = "MASTERMODE";
     private static final String EPSG = "EPSG:";
-    private static final String DEFAULTNAMESPACE = "xtpc";
+    private static final String DEFAULT_NAMESPACE = "xtpc";
     private static final String XGEOSDATACONFIG_PATH = "xgeosdataconfig.xml";
-    private static final String XGEOSRULES_NAME = "DefaultXGeosDataConfigRules.xml";
     private static final String GEOSERVER_BASEURL = "GEOSERVER_URL";
     private static final String GEOSERVER_USER = "GEOSERVER_USER";
     private static final String GEOSERVER_PASS = "GEOSERVER_PASS";
@@ -58,6 +64,7 @@
     // 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;
+    public static final String DEFAULT_STORENAME = "pgDMMS";
 
     private static XGeosDataConfigMapping xgeosDataConfigMapping = null;
 
@@ -102,38 +109,7 @@
 
     protected XGeosDataConfigMapping getConfigMapping() {
         if (xgeosDataConfigMapping == null) {
-            final URL rulesURL = XGeosDataConfigMapping.class.getResource(XGEOSRULES_NAME);
-            assert rulesURL != null;
-
-            DigesterLoader loader = DigesterLoader.newLoader( new FromXmlRulesModule() {
-                        @Override
-                        protected void loadRules() {
-                            loadXMLRules(rulesURL);
-                        }
-
-                    });
-            Digester digester = loader.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");
-            }                            x
-
-            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);
-            }
-            */
+            Digester digester = XGeosConfigDigesterUtils.getXGeosConfigDigester();
             final URL configDataURL = XGeosDataConfigMapping.class.getResource(XGEOSDATACONFIG_PATH);
             try {
                 xgeosDataConfigMapping = (XGeosDataConfigMapping) digester.parse(configDataURL);
@@ -153,10 +129,6 @@
         super.execute(jobExecutionContext);
 
         createTargetDataStore();
-        if (getSourceDataStore() == null) {
-            logger.warn("Cannot connect source oracle database.");
-            throw new JobExecutionException("Cannot connect source oracle database.");
-        }
 
         if (getTargetDataStore() == null) {
             logger.warn("Cannot connect source postgreSQL database.");
@@ -369,7 +341,7 @@
         sql = pf.sprintf(viewName);
         stmt.execute(sql);
         stmt.close();
-        connection.commit();
+        // connection.commit();
     }
 
     private void createOrReplaceExtraView(Connection connection, String schemaName, String tableName, String viewName,
@@ -388,7 +360,7 @@
         sql = pf.sprintf(viewName);
         stmt.execute(sql);
         stmt.close();
-        connection.commit();
+        // connection.commit();
     }
 
     private Timestamp retrieveCurrentSchemaTimestamp(Connection connection, short status) throws SQLException {
@@ -484,6 +456,74 @@
         }
     }
 
+    private HashMap<String, String> buildDefaultStylesMapping(XGeosDataConfigMapping configMapping) {
+        HashMap<String, String> result = new HashMap<String, String>();
+
+        for (Object key : configMapping.getMapping().keySet()) {
+            List xgeosConfigs = (List) configMapping.getMapping().get(key);
+            for (Object value : xgeosConfigs) {
+                XGeosDataConfig xgeosConfig = (XGeosDataConfig) value;
+
+                StringBuilder sbView = new StringBuilder("fsc-");
+                sbView.append(xgeosConfig.getFSC()).append("-c");
+                sbView.append(xgeosConfig.getCOMP()).append("-l");
+                sbView.append(xgeosConfig.getLEV()).append("-w");
+                sbView.append(xgeosConfig.getWEIGHT());
+
+                String viewName = sbView.toString();
+                if (!result.containsKey(viewName)) {
+                    result.put(viewName, xgeosConfig.getFTYPE());
+                } else {
+                    if (xgeosConfig.getFTYPE() != null) {
+                        if (!result.get(viewName).equals(xgeosConfig.getFTYPE()))
+                            logger.info("Style Define Diff:" + result.get(viewName) + " - " + xgeosConfig.getFTYPE());
+                    } else {
+                        logger.warn("xgeosConfig getFTYPE() is null - " + xgeosConfig.toString());
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    private void resetFeatureTypesMapping(JobExecutionContext executionContext, GeoServerRESTReader reader)  {
+        try {
+            Connection connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            if (!checkCurrentRepositoryStatus(connection, DataReposVersionManager.VSSTATUS_LINKVIEW)) {
+                return;
+            }
+
+            RESTStyleList styleList = reader.getStyles();
+
+            // Map styles = dataConfig.getStyles();
+
+            XGeosDataConfigMapping mapping = getConfigMapping();
+            HashMap<String, String> defaultStyles = buildDefaultStylesMapping(mapping);
+
+            try {
+                /*
+                String[] dsFTypeNames = dataStore.getTypeNames();
+
+                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 + "]");
+                        }
+                    } else {
+                        updateFeatureTypeConfig(ftConfig, dataStore, styles, defaultStyles);
+                    }
+                }
+                */
+            } finally {
+                // if (dataStore != null) dataStore.dispose();
+            }
+        } catch (IOException e) {
+            logger.warn(e.getMessage(), e);
+        }
+    }
+
     private void resetGeoServerConfig(JobExecutionContext jobExecutionContext) {
         try {
             URL geoServerURL = new URL(_geoServerURL);
@@ -492,30 +532,32 @@
             List<String> workSpaces = reader.getWorkspaceNames();
             boolean found = false;
             for (String name : workSpaces) {
-                if (name.equalsIgnoreCase(DEFAULTNAMESPACE)) {
+                if (name.equalsIgnoreCase(DEFAULT_NAMESPACE)) {
                     found = true;
                     break;
                 }
             }
 
+            GeoServerRESTPublisher publisher = manager.getPublisher();
             if (!found) {
-                GeoServerRESTPublisher publisher = manager.getPublisher();
-                publisher.createWorkspace(DEFAULTNAMESPACE, new URI("http://tpc.ximple.com.tw/geodmms"));
+                publisher.createWorkspace(DEFAULT_NAMESPACE, new URI("http://tpc.ximple.com.tw/geodmms"));
             }
 
-            RESTDataStore dataStore = reader.getDatastore(DEFAULTNAMESPACE, "pgDMMS");
+            RESTDataStore dataStore = reader.getDatastore(DEFAULT_NAMESPACE, DEFAULT_STORENAME);
             if (dataStore == null) {
                 GeoServerRESTStoreManager storeManager = manager.getStoreManager();
-                GSPostGISDatastoreEncoder store = new GSPostGISDatastoreEncoder("pgDMMS");
+                GSPostGISDatastoreEncoder store = new GSPostGISDatastoreEncoder(DEFAULT_STORENAME);
                 store.setHost(_pgHost);
-                // store.setPort(_pgPort);
+                store.setPort(Integer.parseInt(_pgPort));
                 store.setDatabase(_pgDatabase);
-                store.setSchema("public");
+                store.setSchema(_pgSchema);
                 store.setUser(_pgUsername);
                 store.setPassword(_pgPassword);
-                storeManager.create(DEFAULTNAMESPACE, store);
+                storeManager.create(DEFAULT_NAMESPACE, store);
             }
 
+
+            resetFeatureTypesMapping(jobExecutionContext, reader);
 
             XGeosDataConfigMapping configMapping = getConfigMapping();
             MultiMap configMultiMap = configMapping.getMapping();
@@ -523,6 +565,12 @@
                 List values = (List) configMultiMap.get(key);
                 for (Object value : values) {
                     XGeosDataConfig xgeosConfig = (XGeosDataConfig) value;
+
+                    /*
+                    publishPostGISLayer(publisher, DEFAULT_NAMESPACE, DEFAULT_STORENAME,
+                            xgeosConfig.getPG(),
+                            "EPSG:" + SRSID_TWD97_ZONE121, "");
+                    */
                 }
             }
 
@@ -533,4 +581,116 @@
             logger.warn(e.getMessage(), e);
         }
     }
+
+    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) {
+        String ftName = featureType.getName().getLocalPart();
+        boolean isNormalFeature = false;
+        boolean isLandBased = false;
+        boolean isIndex = false;
+        boolean isSmallIndex = false;
+        boolean isSymbol = false;
+        GeometryDescriptor geomAttrType = featureType.getGeometryDescriptor();
+        Class geomType = geomAttrType.getType().getBinding();
+        if (defaultStyles.containsKey(ftName)) {
+            String defaultStyleName = defaultStyles.get(ftName);
+            String styleName = retrieveDefaultStyle(styles, defaultStyleName, "unknown");
+            if (!styleName.equals("unknown")) {
+                return styleName;
+            }
+        }
+
+        if (ftName.indexOf("fsc") != -1) {
+            isNormalFeature = true;
+        }
+        if (ftName.indexOf("indexshape") != -1) {
+            isIndex = true;
+        }
+        if (ftName.indexOf("indexshapes") != -1) {
+            isSmallIndex = true;
+        }
+        if (ftName.indexOf("lnd") != -1) {
+            isLandBased = true;
+        }
+        /*
+        if (featureType.find("symbol") != -1) {
+            isSymbol = true;
+        }
+        */
+
+        if (Point.class.equals(geomType)) {
+            if (isSymbol) {
+                return retrieveDefaultStyle(styles, "pgTPC_Symbol", "point");
+            } else if (isIndex) {
+                return retrieveDefaultStyle(styles, "pgTPC_TpclidText", "point");
+            } else {
+                return retrieveDefaultStyle(styles, "pgTPC_Text", "point");
+            }
+        } else if (LineString.class.equals(geomType)) {
+            if ((!isIndex) && (!isLandBased)) {
+                return retrieveDefaultStyle(styles, "pgTPC_Conductor", "line");
+            } else if (isIndex) {
+                if (isSmallIndex)
+                    return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPES", "line");
+
+                return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPE", "line");
+            } else if (isLandBased) {
+                return retrieveDefaultStyle(styles, "pgTPC_LndcityLine", "line");
+            }
+        } else if (MultiPoint.class.equals(geomType)) {
+            if (isSymbol) {
+                return retrieveDefaultStyle(styles, "pgTPC_Symbol", "point");
+            } else {
+                return retrieveDefaultStyle(styles, "pgTPC_Text", "point");
+            }
+        } else if (Polygon.class.equals(geomType)) {
+            if ((!isIndex) && (!isLandBased)) {
+                return retrieveDefaultStyle(styles, "polygon", "polygon");
+            } else if (isIndex) {
+                return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPE", "polygon");
+            } else if (isLandBased) {
+                return retrieveDefaultStyle(styles, "pgTPC_LndcityPolygon", "polygon");
+            }
+        } else if (LinearRing.class.equals(geomType)) {
+            if (!isIndex) {
+                return retrieveDefaultStyle(styles, "polygon", "polygon");
+            } else {
+                return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPE", "polygon");
+            }
+        } else if (MultiLineString.class.equals(geomType)) {
+            if ((!isIndex) && (!isLandBased)) {
+                return retrieveDefaultStyle(styles, "pgTPC_Conductor", "line");
+            } else if (isLandBased) {
+                return retrieveDefaultStyle(styles, "pgTPC_LndcityLine", "line");
+            } else {
+                return retrieveDefaultStyle(styles, "pgTPC_INDEXSHAPE", "line");
+            }
+        } else if (MultiPolygon.class.equals(geomType)) {
+            return "polygon";
+        }
+
+        return "pgTPC_Symbol";
+    }
+
+    private static String retrieveDefaultStyle(Map styles, String styleName, String defaultStyleName) {
+        if (styles.containsKey(styleName)) {
+            return styleName;
+        } else
+            return defaultStyleName;
+    }
+
 }

--
Gitblit v0.0.0-SNAPSHOT