package org.geoserver.catalog.impl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.rmi.server.UID;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.commons.collections.MultiHashMap;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogFacade;
import org.geoserver.catalog.CatalogInfo;
import org.geoserver.catalog.CoverageDimensionInfo;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.MapInfo;
import org.geoserver.catalog.MetadataMap;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.WMSLayerInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.ows.util.ClassProperties;
import org.geoserver.ows.util.OwsUtils;
/**
* Default catalog facade implementation in which all objects are stored in memory.
*
* @author Justin Deoliveira, OpenGeo
*
* TODO: look for any exceptions, move them back to catlaog as they indicate logic
*/
public class DefaultCatalogFacade implements CatalogFacade {
public static WorkspaceInfo ANY_WORKSPACE = any(WorkspaceInfo.class);
public static NamespaceInfo ANY_NAMESPACE = any(NamespaceInfo.class);
@SuppressWarnings("unchecked")
static <T extends CatalogInfo> T any(Class<T> clazz) {
Class proxyClass = Proxy.getProxyClass(clazz.getClassLoader(), clazz);
try {
return (T) proxyClass.getConstructor(
new Class[] { InvocationHandler.class }).newInstance(new Object[] {
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
}
} );
}
catch( Exception e ) {
throw new RuntimeException( e );
}
}
/**
* Contains the stores keyed by implementation class
*/
protected MultiHashMap/* <Class> */stores = new MultiHashMap();
/**
* The default store keyed by workspace id
*/
protected Map<String, DataStoreInfo> defaultStores = new HashMap<String, DataStoreInfo>();
/**
* resources
*/
protected MultiHashMap/* <Class> */resources = new MultiHashMap();
/**
* namespaces
*/
protected HashMap<String, NamespaceInfo> namespaces = new HashMap<String, NamespaceInfo>();
/**
* workspaces
*/
protected HashMap<String, WorkspaceInfo> workspaces = new HashMap<String, WorkspaceInfo>();
//JD: Using a CopyOnWriteArrayList is a temporary measure here to deal with some
// concurrency issues around layer access. See GEOS-4404. Long term solution is to us
// concurrent collections (set and map) for all the collections in this class
/**
* layers
*/
protected List<LayerInfo> layers = new CopyOnWriteArrayList<LayerInfo>();
/**
* maps
*/
protected List<MapInfo> maps = new ArrayList<MapInfo>();
/**
* layer groups
*/
protected List<LayerGroupInfo> layerGroups = new ArrayList<LayerGroupInfo>();
/**
* styles
*/
protected List<StyleInfo> styles = new ArrayList();
/**
* the catalog
*/
private CatalogImpl catalog;
public DefaultCatalogFacade(Catalog catalog) {
setCatalog(catalog);
}
public void setCatalog(Catalog catalog) {
this.catalog = (CatalogImpl) catalog;
}
public Catalog getCatalog() {
return null;
}
//
// Stores
//
public StoreInfo add(StoreInfo store) {
resolve(store);
synchronized(stores) {
stores.put(store.getClass(), store);
}
return ModificationProxy.create(store, StoreInfo.class);
}
public void remove(StoreInfo store) {
store = unwrap(store);
synchronized(stores) {
stores.remove(store.getClass(),store);
}
}
public void save(StoreInfo store) {
saved(store);
}
public <T extends StoreInfo> T detach(T store) {
return store;
}
public <T extends StoreInfo> T getStore(String id, Class<T> clazz) {
List l = lookup(clazz, stores);
for (Iterator i = l.iterator(); i.hasNext();) {
StoreInfo store = (StoreInfo) i.next();
if (id.equals(store.getId())) {
return ModificationProxy.create( (T) store, clazz );
}
}
return null;
}
public <T extends StoreInfo> T getStoreByName(WorkspaceInfo workspace,
String name, Class<T> clazz) {
List l = lookup(clazz, stores);
if (workspace == ANY_WORKSPACE) {
//do an exhaustive search through all workspaces
ArrayList matches = new ArrayList();
for (Iterator i = l.iterator(); i.hasNext();) {
T store = (T) i.next();
if ( name.equals( store.getName() ) ) {
matches.add( store );
}
}
if ( matches.size() == 1 ) {
return ModificationProxy.create( (T) matches.get( 0 ), clazz);
}
}
else {
for (Iterator i = l.iterator(); i.hasNext();) {
StoreInfo store = (StoreInfo) i.next();
if (name.equals(store.getName()) && store.getWorkspace().equals( workspace )) {
return ModificationProxy.create( (T) store, clazz );
}
}
}
return null;
}
public <T extends StoreInfo> List<T> getStoresByWorkspace(
WorkspaceInfo workspace, Class<T> clazz) {
//TODO: support ANY_WORKSPACE?
if ( workspace == null ) {
workspace = getDefaultWorkspace();
}
List all = lookup(clazz, stores);
List matches = new ArrayList();
for (Iterator s = all.iterator(); s.hasNext();) {
StoreInfo store = (StoreInfo) s.next();
if (workspace.equals(store.getWorkspace())) {
matches.add(store);
}
}
return ModificationProxy.createList(matches,clazz);
}
public List getStores(Class clazz) {
return ModificationProxy.createList(lookup(clazz, stores) , clazz);
}
public DataStoreInfo getDefaultDataStore(WorkspaceInfo workspace) {
if(defaultStores.containsKey(workspace.getId())) {
DataStoreInfo defaultStore = defaultStores.get(workspace.getId());
return ModificationProxy.create(defaultStore, DataStoreInfo.class);
} else {
return null;
}
}
public void setDefaultDataStore(WorkspaceInfo workspace, DataStoreInfo store) {
DataStoreInfo old = defaultStores.get(workspace.getId());
synchronized(defaultStores) {
if (store != null) {
defaultStores.put(workspace.getId(), store);
}
else {
defaultStores.remove(workspace.getId());
}
}
//fire change event
catalog.fireModified(catalog,
Arrays.asList("defaultDataStore"), Arrays.asList(old), Arrays.asList(store));
}
//
// Resources
//
public ResourceInfo add(ResourceInfo resource) {
resolve(resource);
synchronized(resources) {
resources.put(resource.getClass(), resource);
}
return ModificationProxy.create(resource, ResourceInfo.class);
}
public void remove(ResourceInfo resource) {
resource = unwrap(resource);
synchronized(resources) {
resources.remove(resource.getClass(), resource);
}
}
public void save(ResourceInfo resource) {
saved(resource);
}
public <T extends ResourceInfo> T detach(T resource) {
return resource;
}
public <T extends ResourceInfo> T getResource(String id, Class<T> clazz) {
List l = lookup(clazz, resources);
for (Iterator i = l.iterator(); i.hasNext();) {
ResourceInfo resource = (ResourceInfo) i.next();
if (id.equals(resource.getId())) {
return ModificationProxy.create((T) resource, clazz );
}
}
return null;
}
public <T extends ResourceInfo> T getResourceByName(NamespaceInfo namespace, String name, Class<T> clazz) {
List l = lookup(clazz, resources);
if (namespace == ANY_NAMESPACE) {
//do an exhaustive lookup
List matches = new ArrayList();
for (Iterator i = l.iterator(); i.hasNext();) {
ResourceInfo resource = (ResourceInfo) i.next();
if (name.equals(resource.getName())) {
matches.add( resource );
}
}
if ( matches.size() == 1 ) {
return ModificationProxy.create( (T) matches.get( 0 ), clazz );
}
}
else {
for (Iterator i = l.iterator(); i.hasNext();) {
ResourceInfo resource = (ResourceInfo) i.next();
if (name.equals(resource.getName())) {
NamespaceInfo namespace1 = resource.getNamespace();
if (namespace1 != null && namespace1.equals( namespace )) {
return ModificationProxy.create( (T) resource, clazz );
}
}
}
}
return null;
}
public List getResources(Class clazz) {
return ModificationProxy.createList( lookup(clazz,resources), clazz );
}
public List getResourcesByNamespace(NamespaceInfo namespace, Class clazz) {
//TODO: support ANY_NAMESPACE?
List all = lookup(clazz, resources);
List matches = new ArrayList();
if ( namespace == null ) {
namespace = getDefaultNamespace();
}
for (Iterator r = all.iterator(); r.hasNext();) {
ResourceInfo resource = (ResourceInfo) r.next();
if (namespace != null ) {
if (namespace.equals(resource.getNamespace())) {
matches.add( resource );
}
}
else if ( resource.getNamespace() == null ) {
matches.add(resource);
}
}
return ModificationProxy.createList( matches, clazz );
}
public <T extends ResourceInfo> T getResourceByStore(StoreInfo store,
String name, Class<T> clazz) {
List all = lookup(clazz,resources);
for (Iterator r = all.iterator(); r.hasNext(); ) {
ResourceInfo resource = (ResourceInfo) r.next();
if ( name.equals( resource.getName() ) && store.equals( resource.getStore() ) ) {
return ModificationProxy.create((T)resource, clazz);
}
}
return null;
}
public <T extends ResourceInfo> List<T> getResourcesByStore(
StoreInfo store, Class<T> clazz) {
List all = lookup(clazz,resources);
List matches = new ArrayList();
for (Iterator r = all.iterator(); r.hasNext();) {
ResourceInfo resource = (ResourceInfo) r.next();
if (store.equals(resource.getStore())) {
matches.add(resource);
}
}
return ModificationProxy.createList( matches, clazz );
}
//
// Layers
//
public LayerInfo add(LayerInfo layer) {
resolve(layer);
layers.add(layer);
return ModificationProxy.create(layer, LayerInfo.class);
}
public void remove(LayerInfo layer) {
layers.remove(unwrap(layer));
}
public void save(LayerInfo layer) {
saved(layer);
}
public LayerInfo detach(LayerInfo layer) {
return layer;
}
public LayerInfo getLayer(String id) {
for (LayerInfo layer : layers) {
if (id.equals(layer.getId())) {
return ModificationProxy.create( layer, LayerInfo.class );
}
}
return null;
}
public LayerInfo getLayerByName(String name) {
for (LayerInfo layer : layers) {
if ( name.equals( layer.getName() ) ) {
return ModificationProxy.create( layer, LayerInfo.class );
}
}
return null;
}
public List<LayerInfo> getLayers(ResourceInfo resource) {
List<LayerInfo> matches = new ArrayList<LayerInfo>();
for (LayerInfo layer : layers) {
if ( resource.equals( layer.getResource() ) ) {
matches.add( layer );
}
}
return ModificationProxy.createList(matches,LayerInfo.class);
}
public List<LayerInfo> getLayers(StyleInfo style) {
List<LayerInfo> matches = new ArrayList<LayerInfo>();
for (LayerInfo layer : layers) {
if ( style.equals( layer.getDefaultStyle() ) || layer.getStyles().contains( style ) ) {
matches.add( layer );
}
}
return ModificationProxy.createList(matches,LayerInfo.class);
}
public List<LayerInfo> getLayers() {
return ModificationProxy.createList( new ArrayList(layers), LayerInfo.class );
}
//
// Maps
//
public MapInfo add(MapInfo map) {
resolve(map);
synchronized(maps) {
maps.add(map);
}
return ModificationProxy.create(map, MapInfo.class);
}
public void remove(MapInfo map) {
synchronized(maps) {
maps.remove(unwrap(map));
}
}
public void save(MapInfo map) {
saved( map );
}
public MapInfo detach(MapInfo map) {
return map;
}
public MapInfo getMap(String id) {
for (MapInfo map : maps) {
if (id.equals(map.getId())) {
return ModificationProxy.create(map,MapInfo.class);
}
}
return null;
}
public MapInfo getMapByName(String name) {
for (MapInfo map : maps) {
if (name.equals(map.getName())) {
return ModificationProxy.create(map,MapInfo.class);
}
}
return null;
}
public List<MapInfo> getMaps() {
return ModificationProxy.createList( new ArrayList(maps), MapInfo.class );
}
//
// Layer groups
//
public LayerGroupInfo add (LayerGroupInfo layerGroup) {
resolve(layerGroup);
synchronized(layerGroups) {
layerGroups.add( layerGroup );
}
return ModificationProxy.create(layerGroup, LayerGroupInfo.class);
}
/* (non-Javadoc)
* @see org.geoserver.catalog.impl.CatalogDAO#remove(org.geoserver.catalog.LayerGroupInfo)
*/
public void remove(LayerGroupInfo layerGroup) {
synchronized(layerGroups) {
layerGroups.remove( unwrap(layerGroup) );
}
}
/* (non-Javadoc)
* @see org.geoserver.catalog.impl.CatalogDAO#save(org.geoserver.catalog.LayerGroupInfo)
*/
public void save(LayerGroupInfo layerGroup) {
saved(layerGroup);
}
public LayerGroupInfo detach(LayerGroupInfo layerGroup) {
return layerGroup;
}
public List<LayerGroupInfo> getLayerGroups() {
return ModificationProxy.createList( new ArrayList(layerGroups), LayerGroupInfo.class );
}
public LayerGroupInfo getLayerGroup(String id) {
for (LayerGroupInfo layerGroup : layerGroups ) {
if ( id.equals( layerGroup.getId() ) ) {
return ModificationProxy.create(layerGroup,LayerGroupInfo.class);
}
}
return null;
}
public LayerGroupInfo getLayerGroupByName(String name) {
for (LayerGroupInfo layerGroup : layerGroups ) {
if ( name.equals( layerGroup.getName() ) ) {
return ModificationProxy.create(layerGroup,LayerGroupInfo.class);
}
}
return null;
}
//
// Namespaces
//
public NamespaceInfo add(NamespaceInfo namespace) {
resolve(namespace);
synchronized(namespaces) {
namespaces.put(namespace.getPrefix(),namespace);
}
return ModificationProxy.create(namespace, NamespaceInfo.class);
}
public void remove(NamespaceInfo namespace) {
synchronized(namespaces) {
NamespaceInfo defaultNamespace = getDefaultNamespace();
if (namespace.equals(defaultNamespace)) {
namespaces.remove(null);
namespaces.remove(Catalog.DEFAULT);
}
namespaces.remove(namespace.getPrefix());
}
}
public void save(NamespaceInfo namespace) {
ModificationProxy h =
(ModificationProxy) Proxy.getInvocationHandler(namespace);
NamespaceInfo ns = (NamespaceInfo) h.getProxyObject();
if ( !namespace.getPrefix().equals( ns.getPrefix() ) ) {
synchronized (namespaces) {
namespaces.remove( ns.getPrefix() );
namespaces.put( namespace.getPrefix(), ns );
}
}
saved(namespace);
}
public NamespaceInfo detach(NamespaceInfo namespace) {
return namespace;
}
public NamespaceInfo getDefaultNamespace() {
return namespaces.get(null) != null ?
ModificationProxy.create(namespaces.get( null ),NamespaceInfo.class) : null;
}
public void setDefaultNamespace(NamespaceInfo defaultNamespace) {
NamespaceInfo ns = defaultNamespace != null ? namespaces.get(defaultNamespace.getPrefix()) : null;
NamespaceInfo old = namespaces.get(null);
if(ns != null) {
namespaces.put( null, ns );
namespaces.put( Catalog.DEFAULT, ns );
} else {
namespaces.remove( null);
namespaces.remove( Catalog.DEFAULT);
}
//fire change event
catalog.fireModified(catalog,
Arrays.asList("defaultNamespace"), Arrays.asList(old), Arrays.asList(defaultNamespace));
}
public NamespaceInfo getNamespace(String id) {
for (NamespaceInfo namespace : namespaces.values() ) {
if (id.equals(namespace.getId())) {
return ModificationProxy.create( namespace, NamespaceInfo.class );
}
}
return null;
}
public NamespaceInfo getNamespaceByPrefix(String prefix) {
NamespaceInfo ns = namespaces.get( prefix );
return ns != null ? ModificationProxy.create(ns, NamespaceInfo.class ) : null;
}
public NamespaceInfo getNamespaceByURI(String uri) {
for (NamespaceInfo namespace : namespaces.values() ) {
if (uri.equals(namespace.getURI())) {
return ModificationProxy.create( namespace, NamespaceInfo.class );
}
}
return null;
}
public List getNamespaces() {
ArrayList<NamespaceInfo> ns = new ArrayList<NamespaceInfo>();
for ( Map.Entry<String,NamespaceInfo> e : namespaces.entrySet() ) {
if ( e.getKey() == null || e.getKey().equals(Catalog.DEFAULT))
continue;
ns.add( e.getValue() );
}
return ModificationProxy.createList( ns, NamespaceInfo.class );
}
//
// Workspaces
//
// Workspace methods
public WorkspaceInfo add(WorkspaceInfo workspace) {
resolve(workspace);
synchronized (workspaces) {
workspaces.put( workspace.getName(), workspace );
}
return ModificationProxy.create(workspace, WorkspaceInfo.class);
}
public void remove(WorkspaceInfo workspace) {
synchronized(workspaces) {
workspaces.remove( workspace.getName() );
}
}
public void save(WorkspaceInfo workspace) {
ModificationProxy h =
(ModificationProxy) Proxy.getInvocationHandler(workspace);
WorkspaceInfo ws = (WorkspaceInfo) h.getProxyObject();
if ( !workspace.getName().equals( ws.getName() ) ) {
synchronized (workspaces) {
workspaces.remove( ws.getName() );
workspaces.put( workspace.getName(), ws );
}
}
saved(workspace);
}
public WorkspaceInfo detach(WorkspaceInfo workspace) {
return workspace;
}
public WorkspaceInfo getDefaultWorkspace() {
return workspaces.containsKey( null ) ?
ModificationProxy.create( workspaces.get( null ), WorkspaceInfo.class ) : null;
}
public void setDefaultWorkspace(WorkspaceInfo workspace) {
WorkspaceInfo old = workspaces.get(null);
synchronized(workspaces) {
if (workspace != null) {
WorkspaceInfo ws = workspaces.get(workspace.getName());
workspaces.put( null, ws );
workspaces.put( "default", ws );
}
else {
workspaces.remove(null);
workspaces.remove("default");
}
}
//fire change event
catalog.fireModified(catalog,
Arrays.asList("defaultWorkspace"), Arrays.asList(old), Arrays.asList(workspace));
}
public List<WorkspaceInfo> getWorkspaces() {
ArrayList<WorkspaceInfo> ws = new ArrayList<WorkspaceInfo>();
//strip out default namespace
for ( Map.Entry<String, WorkspaceInfo> e : workspaces.entrySet() ) {
if ( e.getKey() == null || e.getKey().equals(Catalog.DEFAULT) ) {
continue;
}
ws.add( e.getValue() );
}
return ModificationProxy.createList( ws, WorkspaceInfo.class );
}
public WorkspaceInfo getWorkspace(String id) {
for ( WorkspaceInfo ws : workspaces.values() ) {
if ( id.equals( ws.getId() ) ) {
return ModificationProxy.create(ws,WorkspaceInfo.class);
}
}
return null;
}
public WorkspaceInfo getWorkspaceByName(String name) {
return workspaces.containsKey(name) ?
ModificationProxy.create( workspaces.get( name ), WorkspaceInfo.class ) : null;
}
//
// Styles
//
public StyleInfo add(StyleInfo style) {
resolve(style);
synchronized(styles) {
styles.add(style);
}
return ModificationProxy.create(style, StyleInfo.class);
}
public void remove(StyleInfo style) {
synchronized(styles) {
styles.remove(unwrap(style));
}
}
public void save(StyleInfo style) {
saved( style );
}
public StyleInfo detach(StyleInfo style) {
return style;
}
public StyleInfo getStyle(String id) {
for (Iterator s = styles.iterator(); s.hasNext();) {
StyleInfo style = (StyleInfo) s.next();
if (id.equals(style.getId())) {
return ModificationProxy.create(style,StyleInfo.class);
}
}
return null;
}
public StyleInfo getStyleByName(String name) {
for (Iterator s = styles.iterator(); s.hasNext();) {
StyleInfo style = (StyleInfo) s.next();
if (name.equals(style.getName())) {
return ModificationProxy.create(style,StyleInfo.class);
}
}
return null;
}
public List getStyles() {
return ModificationProxy.createList(styles,StyleInfo.class);
}
//
// Utilities
//
public static <T> T unwrap(T obj) {
return ModificationProxy.unwrap(obj);
}
protected void saved(CatalogInfo object) {
//this object is a proxy
ModificationProxy h =
(ModificationProxy) Proxy.getInvocationHandler(object);
//get the real object
CatalogInfo real = (CatalogInfo) h.getProxyObject();
//fire out what changed
List propertyNames = h.getPropertyNames();
List newValues = h.getNewValues();
List oldValues = h.getOldValues();
//TODO: protect this original object, perhaps with another proxy
catalog.fireModified( real, propertyNames, oldValues, newValues );
//commit to the original object
h.commit();
//resolve to do a sync on the object
//syncIdWithName(real);
//fire the post modify event
catalog.firePostModified( real );
}
List lookup(Class clazz, MultiHashMap map) {
ArrayList result = new ArrayList();
for (Iterator k = map.keySet().iterator(); k.hasNext();) {
Class key = (Class) k.next();
if (clazz.isAssignableFrom(key)) {
result.addAll(map.getCollection(key));
}
}
return result;
}
public void dispose() {
if ( stores != null ) stores.clear();
if ( defaultStores != null ) defaultStores.clear();
if ( resources != null ) resources.clear();
if ( namespaces != null ) namespaces.clear();
if ( workspaces != null ) workspaces.clear();
if ( layers != null ) layers.clear();
if ( layerGroups != null ) layerGroups.clear();
if ( maps != null ) maps.clear();
if ( styles != null ) styles.clear();
}
public void resolve() {
//JD creation checks are done here b/c when xstream depersists
// some members may be left null
//workspaces
if ( workspaces == null ) {
workspaces = new HashMap<String, WorkspaceInfo>();
}
for ( WorkspaceInfo ws : workspaces.values() ) {
resolve(ws);
}
//namespaces
if ( namespaces == null ) {
namespaces = new HashMap<String, NamespaceInfo>();
}
for ( NamespaceInfo ns : namespaces.values() ) {
resolve(ns);
}
//stores
if ( stores == null ) {
stores = new MultiHashMap();
}
for ( Object o : stores.values() ) {
resolve((StoreInfoImpl)o);
}
//styles
if ( styles == null ) {
styles = new ArrayList<StyleInfo>();
}
for ( StyleInfo s : styles ) {
resolve(s);
}
//resources
if ( resources == null ) {
resources = new MultiHashMap();
}
for( Object o : resources.values() ) {
resolve((ResourceInfo)o);
}
//layers
if ( layers == null ) {
layers = new CopyOnWriteArrayList<LayerInfo>();
}
for ( LayerInfo l : layers ) {
resolve(l);
}
//layer groups
if ( layerGroups == null ) {
layerGroups = new ArrayList<LayerGroupInfo>();
}
for ( LayerGroupInfo lg : layerGroups ) {
resolve(lg);
}
//maps
if ( maps == null ) {
maps = new ArrayList<MapInfo>();
}
for ( MapInfo m : maps ) {
resolve(m);
}
}
protected void resolve(WorkspaceInfo workspace) {
setId(workspace);
}
protected void resolve(NamespaceInfo namespace) {
setId(namespace);
}
protected void resolve(StoreInfo store) {
setId(store);
StoreInfoImpl s = (StoreInfoImpl) store;
//resolve the workspace
WorkspaceInfo resolved = ResolvingProxy.resolve( catalog, s.getWorkspace());
if ( resolved != null ) {
resolved = unwrap(resolved);
s.setWorkspace( resolved );
}
else {
//this means the workspace has not yet been added to the catalog, keep the proxy around
}
}
protected void resolve(ResourceInfo resource) {
setId(resource);
ResourceInfoImpl r = (ResourceInfoImpl) resource;
//resolve the store
StoreInfo store = ResolvingProxy.resolve( catalog, r.getStore() );
if ( store != null ) {
store = unwrap(store);
r.setStore(store);
}
//resolve the namespace
NamespaceInfo namespace = ResolvingProxy.resolve( catalog, r.getNamespace() );
if (namespace != null) {
namespace = unwrap(namespace);
r.setNamespace(namespace);
}
}
protected void resolve(LayerInfo layer) {
setId(layer);
ResourceInfo resource = ResolvingProxy.resolve(catalog, layer.getResource());
if (resource != null) {
resource = unwrap(resource);
layer.setResource(resource);
}
StyleInfo style = ResolvingProxy.resolve(catalog, layer.getDefaultStyle());
if (style != null) {
style = unwrap(style);
layer.setDefaultStyle(style);
}
LinkedHashSet<StyleInfo> styles = new LinkedHashSet();
for (StyleInfo s : layer.getStyles()) {
s = ResolvingProxy.resolve(catalog, s);
s = unwrap(s);
styles.add(s);
}
((LayerInfoImpl)layer).setStyles(styles);
}
protected void resolve(LayerGroupInfo layerGroup) {
setId(layerGroup);
LayerGroupInfoImpl lg = (LayerGroupInfoImpl) layerGroup;
for ( int i = 0; i < lg.getLayers().size(); i++ ) {
LayerInfo l = lg.getLayers().get( i );
LayerInfo resolved = unwrap(ResolvingProxy.resolve( catalog, l ));
lg.getLayers().set( i, resolved );
}
for ( int i = 0; i < lg.getStyles().size(); i++ ) {
StyleInfo s = lg.getStyles().get( i );
if(s != null) {
StyleInfo resolved = unwrap(ResolvingProxy.resolve( catalog, s ));
lg.getStyles().set( i, resolved );
}
}
}
protected void resolve(StyleInfo style) {
setId(style);
}
protected void resolve(MapInfo map) {
setId(map);
}
protected void setId( Object o ) {
if ( OwsUtils.get( o, "id") == null ) {
String uid = new UID().toString();
OwsUtils.set( o, "id", o.getClass().getSimpleName() + "-"+uid );
}
}
public void syncTo(CatalogFacade dao) {
if (dao instanceof DefaultCatalogFacade) {
//do an optimized sync
DefaultCatalogFacade other = (DefaultCatalogFacade) dao;
other.stores = stores;
other.defaultStores = defaultStores;
other.resources = resources;
other.namespaces = namespaces;
other.workspaces = workspaces;
other.layers = layers;
other.maps = maps;
other.layerGroups = layerGroups;
other.styles = styles;
}
else {
//do a manual import
for (Map.Entry<String,WorkspaceInfo> e : workspaces.entrySet()) {
if (e.getKey() != null && !"default".equals(e.getKey())) {
dao.add(e.getValue());
}
}
for (Map.Entry<String,NamespaceInfo> e : namespaces.entrySet()) {
if (e.getKey() != null && !"default".equals(e.getKey())) {
dao.add(e.getValue());
}
}
for (Iterator k = stores.keySet().iterator(); k.hasNext();) {
Class key = (Class) k.next();
Collection<StoreInfo> val = stores.getCollection(key);
for (StoreInfo s : val) {
dao.add(s);
}
}
for (Iterator k = resources.keySet().iterator(); k.hasNext();) {
Class key = (Class) k.next();
Collection<ResourceInfo> val = resources.getCollection(key);
for (ResourceInfo r : val) {
dao.add(r);
}
}
for (StyleInfo s : styles) { dao.add(s); }
for (LayerInfo l : layers) { dao.add(l); }
for (LayerGroupInfo lg : layerGroups) { dao.add(lg); }
for (MapInfo m : maps) { dao.add(m); }
if (workspaces.containsKey(null)) {
dao.setDefaultWorkspace(workspaces.get(null));
}
if (namespaces.containsKey(null)) {
dao.setDefaultNamespace(namespaces.get(null));
}
for (Map.Entry<String, DataStoreInfo> e : defaultStores.entrySet()) {
WorkspaceInfo ws = workspaces.get(e.getKey());
dao.setDefaultDataStore(ws, e.getValue());
}
}
}
}