/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2012 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.csw.store.internal;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.config.GeoServer;
import org.geoserver.data.util.IOUtils;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.Resources;
import org.geoserver.security.PropertyFileWatcher;
import org.geotools.util.logging.Logging;
import org.opengis.feature.type.Name;
/**
* Internal Catalog Store that automatically loads mappings from mapping files in GeoServer Data Directory.
*
* @author Niels Charlier
*
*/
public class GeoServerInternalCatalogStore extends InternalCatalogStore {
protected static final Logger LOGGER = Logging.getLogger(GeoServerInternalCatalogStore.class);
protected Map<String, PropertyFileWatcher> watchers = new HashMap<String, PropertyFileWatcher>();
/**
* Get Mapping, update from file if changed
*
* @param typeName
* @return the mapping
*/
public CatalogStoreMapping getMapping(String typeName) {
PropertyFileWatcher watcher = watchers.get(typeName);
if (watcher!=null && watcher.isModified() ) {
try {
addMapping (typeName, CatalogStoreMapping.parse(new HashMap<String, String>((Map) watcher.getProperties())));
} catch (IOException e) {
LOGGER.log(Level.WARNING, e.toString());
}
}
return super.getMapping( typeName);
}
/**
* Create GeoServerInternalCatalogStore
*
* @param geoserver
* @throws IOException
*/
public GeoServerInternalCatalogStore(GeoServer geoserver) throws IOException {
super( geoserver.getCatalog());
GeoServerResourceLoader loader = geoserver.getCatalog().getResourceLoader();
Resource dir = loader.get("csw");
for (Name name : descriptorByType.keySet()) {
String typeName = name.getLocalPart();
Resource f = dir.get(typeName + ".properties");
PropertyFileWatcher watcher = new PropertyFileWatcher(f);
watchers.put(typeName, watcher);
if (!Resources.exists(f)) {
IOUtils.copy(getClass().getResourceAsStream(typeName + ".default.properties"),f.out());
}
addMapping (typeName, CatalogStoreMapping.parse(new HashMap<String, String>((Map) watcher.getProperties())));
}
}
}