Package org.geoserver.jdbcconfig.catalog

Source Code of org.geoserver.jdbcconfig.catalog.JDBCCatalogFacade

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.jdbcconfig.catalog;

import static com.google.common.base.Preconditions.checkNotNull;
import static org.geoserver.catalog.Predicates.acceptAll;
import static org.geoserver.catalog.Predicates.and;
import static org.geoserver.catalog.Predicates.equal;
import static org.geoserver.catalog.Predicates.isNull;

import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;

import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogFacade;
import org.geoserver.catalog.CatalogInfo;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.MapInfo;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.catalog.impl.CatalogImpl;
import org.geoserver.catalog.impl.ClassMappings;
import org.geoserver.catalog.impl.ModificationProxy;
import org.geoserver.catalog.util.CloseableIterator;
import org.geoserver.jdbcconfig.internal.ConfigDatabase;
import org.geoserver.ows.util.OwsUtils;
import org.geotools.util.Utilities;
import org.opengis.filter.Filter;
import org.opengis.filter.sort.SortBy;
import org.springframework.util.Assert;

import com.google.common.base.Preconditions;

/**
* @author groldan
*
*/
@ParametersAreNonnullByDefault
public class JDBCCatalogFacade implements CatalogFacade {

    private final ConfigDatabase db;

    public JDBCCatalogFacade(final ConfigDatabase db) {
        this.db = db;
    }

    public ConfigDatabase getConfigDatabase() {
        return db;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getCatalog()
     */
    @Override
    public Catalog getCatalog() {
        return this.db.getCatalog();
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#setCatalog(org.geoserver.catalog.Catalog)
     */
    @Override
    public void setCatalog(final Catalog catalog) {
        Preconditions.checkArgument(catalog instanceof CatalogImpl);
        this.db.setCatalog((CatalogImpl) catalog);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#add(org.geoserver.catalog.StoreInfo)
     */
    @Override
    public StoreInfo add(StoreInfo store) {
        return addInternal(store);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#remove(org.geoserver.catalog.StoreInfo)
     */
    @Override
    public void remove(StoreInfo store) {
        db.remove(store);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#save(org.geoserver.catalog.StoreInfo)
     */
    @Override
    public void save(StoreInfo store) {
        saveInternal(store, StoreInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#detach(org.geoserver.catalog.StoreInfo)
     */
    @Override
    public <T extends StoreInfo> T detach(T store) {
        return store;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#detach(org.geoserver.catalog.ResourceInfo)
     */
    @Override
    public <T extends ResourceInfo> T detach(T resource) {
        return resource;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getStore(java.lang.String, java.lang.Class)
     */
    @Override
    public <T extends StoreInfo> T getStore(String id, Class<T> clazz) {
        return db.getById(id, clazz);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getStoreByName(org.geoserver.catalog.WorkspaceInfo,
     *      java.lang.String, java.lang.Class)
     */
    @Override
    public <T extends StoreInfo> T getStoreByName(WorkspaceInfo workspace, String name,
            Class<T> clazz) {

        Filter filter = equal("name", name);
        if (null != workspace && ANY_WORKSPACE != workspace) {
            Filter wsFilter = equal("workspace.id", workspace.getId());
            filter = and(filter, wsFilter);
        }

        T store;
        try {
            store = findUnique(clazz, filter);
        } catch (IllegalArgumentException e) {
            return null;
        }
        return store;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getStoresByWorkspace(org.geoserver.catalog.WorkspaceInfo,
     *      java.lang.Class)
     */
    @Override
    public <T extends StoreInfo> List<T> getStoresByWorkspace(WorkspaceInfo workspace,
            Class<T> clazz) {

        Filter filter = acceptAll();
        if (null != workspace && ANY_WORKSPACE != workspace) {
            filter = equal("workspace.id", workspace.getId());
        }

        List<T> list = db.queryAsList(clazz, filter, null, null, null);

        return list;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getStores(java.lang.Class)
     */
    @Override
    public <T extends StoreInfo> List<T> getStores(Class<T> clazz) {
        return db.getAll(clazz);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getDefaultDataStore(org.geoserver.catalog.WorkspaceInfo)
     */
    @Override
    public DataStoreInfo getDefaultDataStore(WorkspaceInfo workspace) {
        final String target = WorkspaceInfo.class.getSimpleName() + "." + workspace.getId();
        return db.getDefault(target, DataStoreInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#setDefaultDataStore(org.geoserver.catalog.WorkspaceInfo,
     *      org.geoserver.catalog.DataStoreInfo)
     */
    @Override
    public void setDefaultDataStore(WorkspaceInfo workspace, @Nullable DataStoreInfo store) {

        String target = "WorkspaceInfo." + workspace.getId();
        String id = store == null ? null : store.getId();

        DataStoreInfo old = getDefaultDataStore(workspace);

        db.setDefault(target, id);

        // fire change event
        if (!Utilities.equals(old, workspace)) {
            Catalog catalog = getCatalog();
            catalog.fireModified(catalog, Arrays.asList("defaultDataStore"), Arrays.asList(old),
                    Arrays.asList(store));
        }
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#add(org.geoserver.catalog.ResourceInfo)
     */
    @Override
    public ResourceInfo add(ResourceInfo resource) {
        return addInternal(resource);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#remove(org.geoserver.catalog.ResourceInfo)
     */
    @Override
    public void remove(ResourceInfo resource) {
        db.remove(resource);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#save(org.geoserver.catalog.ResourceInfo)
     */
    @Override
    public void save(ResourceInfo resource) {
        saveInternal(resource, ResourceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getResource(java.lang.String, java.lang.Class)
     */
    @Override
    public <T extends ResourceInfo> T getResource(String id, Class<T> clazz) {
        return db.getById(id, clazz);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getResourceByName(org.geoserver.catalog.NamespaceInfo,
     *      java.lang.String, java.lang.Class)
     */
    @Override
    public <T extends ResourceInfo> T getResourceByName(NamespaceInfo namespace, String name,
            Class<T> clazz) {

        Filter filter = equal("name", name);
        if (null != namespace && ANY_NAMESPACE != namespace) {
            Filter wsFilter = equal("namespace.id", namespace.getId());
            filter = and(filter, wsFilter);
        }

        T resource;
        try {
            resource = findUnique(clazz, filter);
        } catch (IllegalArgumentException e) {
            return null;
        }
        return resource;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getResources(java.lang.Class)
     */
    @Override
    public <T extends ResourceInfo> List<T> getResources(Class<T> clazz) {
        return db.getAll(clazz);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getResourcesByNamespace(org.geoserver.catalog.NamespaceInfo,
     *      java.lang.Class)
     */
    @Override
    public <T extends ResourceInfo> List<T> getResourcesByNamespace(NamespaceInfo namespace,
            Class<T> clazz) {

        Filter filter = acceptAll();
        if (null != namespace && ANY_NAMESPACE != namespace) {
            filter = equal("namespace.id", namespace.getId());
        }

        return db.queryAsList(clazz, filter, null, null, null);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getResourceByStore(org.geoserver.catalog.StoreInfo,
     *      java.lang.String, java.lang.Class)
     */
    @Override
    public <T extends ResourceInfo> T getResourceByStore(StoreInfo store, String name,
            Class<T> clazz) {

        Filter filter = equal("name", name);
        Filter storeFilter = equal("store.id", store.getId());
        filter = and(filter, storeFilter);

        T res;
        try {
            res = findUnique(clazz, filter);
        } catch (IllegalArgumentException e) {
            return null;
        }
        return res;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getResourcesByStore(org.geoserver.catalog.StoreInfo,
     *      java.lang.Class)
     */
    @Override
    public <T extends ResourceInfo> List<T> getResourcesByStore(StoreInfo store, Class<T> clazz) {

        Filter filter = equal("store.id", store.getId());

        return db.queryAsList(clazz, filter, null, null, null);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#add(org.geoserver.catalog.LayerInfo)
     */
    @Override
    public LayerInfo add(LayerInfo layer) {
        return addInternal(layer);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#remove(org.geoserver.catalog.LayerInfo)
     */
    @Override
    public void remove(LayerInfo layer) {
        db.remove(layer);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#save(org.geoserver.catalog.LayerInfo)
     */
    @Override
    public void save(LayerInfo layer) {
        saveInternal(layer, LayerInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#detach(org.geoserver.catalog.LayerInfo)
     */
    @Override
    public LayerInfo detach(LayerInfo layer) {
        return layer;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayer(java.lang.String)
     */
    @Override
    public LayerInfo getLayer(String id) {
        return db.getById(id, LayerInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayerByName(java.lang.String)
     */
    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayerByName(java.lang.String)
     */
    @Override
    public LayerInfo getLayerByName(String name) {
        return getByName(name, LayerInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayers(org.geoserver.catalog.ResourceInfo)
     */
    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayers(org.geoserver.catalog.ResourceInfo)
     */
    @Override
    public List<LayerInfo> getLayers(ResourceInfo resource) {

        Filter filter = equal("resource.id", resource.getId());

        return db.queryAsList(LayerInfo.class, filter, null, null, null);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayers(org.geoserver.catalog.StyleInfo)
     */
    @Override
    public List<LayerInfo> getLayers(StyleInfo style) {

        Filter filter = equal("defaultStyle.id", style.getId());
        Filter anyStyle = equal("styles[].id", style.getId());

        filter = and(filter, anyStyle);

        return db.queryAsList(LayerInfo.class, filter, null, null, null);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayers()
     */
    @Override
    public List<LayerInfo> getLayers() {
        return db.getAll(LayerInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#add(org.geoserver.catalog.MapInfo)
     */
    @Override
    public MapInfo add(MapInfo map) {
        return addInternal(map);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#remove(org.geoserver.catalog.MapInfo)
     */
    @Override
    public void remove(MapInfo map) {
        db.remove(map);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#save(org.geoserver.catalog.MapInfo)
     */
    @Override
    public void save(MapInfo map) {
        saveInternal(map, MapInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#detach(org.geoserver.catalog.MapInfo)
     */
    @Override
    public MapInfo detach(MapInfo map) {
        return map;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getMap(java.lang.String)
     */
    @Override
    public MapInfo getMap(String id) {
        return db.getById(id, MapInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getMapByName(java.lang.String)
     */
    @Override
    public MapInfo getMapByName(String name) {
        return getByName(name, MapInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getMaps()
     */
    @Override
    public List<MapInfo> getMaps() {
        return db.getAll(MapInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#add(org.geoserver.catalog.LayerGroupInfo)
     */
    @Override
    public LayerGroupInfo add(LayerGroupInfo layerGroup) {
        return addInternal(layerGroup);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#remove(org.geoserver.catalog.LayerGroupInfo)
     */
    @Override
    public void remove(LayerGroupInfo layerGroup) {
        db.remove(layerGroup);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#save(org.geoserver.catalog.LayerGroupInfo)
     */
    @Override
    public void save(LayerGroupInfo layerGroup) {
        saveInternal(layerGroup, LayerGroupInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#detach(org.geoserver.catalog.LayerGroupInfo)
     */
    @Override
    public LayerGroupInfo detach(LayerGroupInfo layerGroup) {
        return layerGroup;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayerGroup(java.lang.String)
     */
    @Override
    public LayerGroupInfo getLayerGroup(String id) {
        return db.getById(id, LayerGroupInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayerGroupByName(java.lang.String)
     */
    @Override
    public LayerGroupInfo getLayerGroupByName(String name) {
        return getByName(name, LayerGroupInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getLayerGroups()
     */
    @Override
    public List<LayerGroupInfo> getLayerGroups() {
        return db.getAll(LayerGroupInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#add(org.geoserver.catalog.NamespaceInfo)
     */
    @Override
    public NamespaceInfo add(NamespaceInfo namespace) {
        return addInternal(namespace);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#remove(org.geoserver.catalog.NamespaceInfo)
     */
    @Override
    public void remove(NamespaceInfo namespace) {
        db.remove(namespace);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#save(org.geoserver.catalog.NamespaceInfo)
     */
    @Override
    public void save(NamespaceInfo namespace) {
        saveInternal(namespace, NamespaceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#detach(org.geoserver.catalog.NamespaceInfo)
     */
    @Override
    public NamespaceInfo detach(NamespaceInfo namespace) {
        return namespace;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getDefaultNamespace()
     */
    @Override
    public NamespaceInfo getDefaultNamespace() {
        return db.getDefault(NamespaceInfo.class.getSimpleName(), NamespaceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#setDefaultNamespace(org.geoserver.catalog.NamespaceInfo)
     */
    @Override
    public void setDefaultNamespace(@Nullable NamespaceInfo defaultNamespace) {
        String target = NamespaceInfo.class.getSimpleName();
        String id = defaultNamespace == null ? null : defaultNamespace.getId();

        NamespaceInfo old = getDefaultNamespace();

        db.setDefault(target, id);

        if (!Utilities.equals(old, defaultNamespace)) {
            // fire change event
            Catalog catalog = getCatalog();
            catalog.fireModified(catalog, Arrays.asList("defaultNamespace"), Arrays.asList(old),
                    Arrays.asList(defaultNamespace));
        }
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getNamespace(java.lang.String)
     */
    @Override
    public NamespaceInfo getNamespace(String id) {
        return db.getById(id, NamespaceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getNamespaceByPrefix(java.lang.String)
     */
    @Override
    public NamespaceInfo getNamespaceByPrefix(String prefix) {
        Filter filter = equal("prefix", prefix);
        try {
            return findUnique(NamespaceInfo.class, filter);
        } catch (IllegalArgumentException multipleResults) {
            return null;
        }
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getNamespaceByURI(java.lang.String)
     */
    @Override
    public NamespaceInfo getNamespaceByURI(String uri) {

        Filter filter = equal("URI", uri);
        try {
            return findUnique(NamespaceInfo.class, filter);
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getNamespaces()
     */
    @Override
    public List<NamespaceInfo> getNamespaces() {
        return db.getAll(NamespaceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#add(org.geoserver.catalog.WorkspaceInfo)
     */
    @Override
    public WorkspaceInfo add(WorkspaceInfo workspace) {
        return addInternal(workspace);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#remove(org.geoserver.catalog.WorkspaceInfo)
     */
    @Override
    public void remove(WorkspaceInfo workspace) {
        db.remove(workspace);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#save(org.geoserver.catalog.WorkspaceInfo)
     */
    @Override
    public void save(WorkspaceInfo workspace) {
        saveInternal(workspace, WorkspaceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#detach(org.geoserver.catalog.WorkspaceInfo)
     */
    @Override
    public WorkspaceInfo detach(WorkspaceInfo workspace) {
        return workspace;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getDefaultWorkspace()
     */
    @Override
    public WorkspaceInfo getDefaultWorkspace() {
        return db.getDefault(WorkspaceInfo.class.getSimpleName(), WorkspaceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#setDefaultWorkspace(org.geoserver.catalog.WorkspaceInfo)
     */
    @Override
    public void setDefaultWorkspace(@Nullable WorkspaceInfo workspace) {
        String type = WorkspaceInfo.class.getSimpleName();
        String id = workspace == null ? null : workspace.getId();

        WorkspaceInfo old = getDefaultWorkspace();

        db.setDefault(type, id);

        if (!Utilities.equals(old, workspace)) {
            // fire change event
            Catalog catalog = getCatalog();
            catalog.fireModified(catalog, Arrays.asList("defaultWorkspace"), Arrays.asList(old),
                    Arrays.asList(workspace));
        }
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getWorkspace(java.lang.String)
     */
    @Override
    public WorkspaceInfo getWorkspace(String id) {
        return db.getById(id, WorkspaceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getWorkspaceByName(java.lang.String)
     */
    @Override
    public WorkspaceInfo getWorkspaceByName(String name) {
        // if ("web".equals(name))
        // return null;
        return getByName(name, WorkspaceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getWorkspaces()
     */
    @Override
    public List<WorkspaceInfo> getWorkspaces() {
        return db.getAll(WorkspaceInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#add(org.geoserver.catalog.StyleInfo)
     */
    @Override
    public StyleInfo add(StyleInfo style) {
        return addInternal(style);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#remove(org.geoserver.catalog.StyleInfo)
     */
    @Override
    public void remove(StyleInfo style) {
        db.remove(style);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#save(org.geoserver.catalog.StyleInfo)
     */
    @Override
    public void save(StyleInfo style) {
        saveInternal(style, StyleInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#detach(org.geoserver.catalog.StyleInfo)
     */
    @Override
    public StyleInfo detach(StyleInfo style) {
        return style;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getStyle(java.lang.String)
     */
    @Override
    public StyleInfo getStyle(String id) {
        return db.getById(id, StyleInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getStyleByName(java.lang.String)
     */
    @Override
    public StyleInfo getStyleByName(String name) {
        return getStyleByName(NO_WORKSPACE, name);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#getStyles()
     */
    @Override
    public List<StyleInfo> getStyles() {
        return db.getAll(StyleInfo.class);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#dispose()
     */
    @Override
    public void dispose() {
        db.dispose();
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#resolve()
     */
    @Override
    public void resolve() {
        //
    }

    @Override
    public LayerGroupInfo getLayerGroupByName(WorkspaceInfo workspace, String name) {
        Filter filter = equal("name", name);
        if (NO_WORKSPACE == workspace) {
            Filter wsFilter = isNull("workspace.id");
            filter = and(filter, wsFilter);
        } else if (workspace != null && ANY_WORKSPACE != workspace) {
            Filter wsFilter = equal("workspace.id", workspace.getId());
            filter = and(filter, wsFilter);
        }

        LayerGroupInfo store;
        try {
            store = findUnique(LayerGroupInfo.class, filter);
        } catch (IllegalArgumentException e) {
            return null;
        }
        return store;
    }

    @Override
    public List<LayerGroupInfo> getLayerGroupsByWorkspace(WorkspaceInfo workspace) {

        if (workspace == null) {
            workspace = getDefaultWorkspace();
        }
        if (workspace == null) {
            return Collections.emptyList();
        }
        Filter filter;
        if (NO_WORKSPACE == workspace) {
            filter = isNull("workspace.id");
        } else {
            filter = equal("workspace.id", workspace.getId());
        }
        return db.queryAsList(LayerGroupInfo.class, filter, null, null, null);
    }

    @Override
    public StyleInfo getStyleByName(WorkspaceInfo workspace, String name) {
        checkNotNull(workspace,
                "workspace is null. Did you mean CatalogFacade.ANY_WORKSPACE or CatalogFacade.NO_WORKSPACE?");
        checkNotNull(name, "name");

        Filter nameFilter = equal("name", name);
        Filter wsFilter;
        if (workspace == NO_WORKSPACE) {
            wsFilter = isNull("workspace.id");
        } else if (workspace == ANY_WORKSPACE) {
            wsFilter = acceptAll();
        } else {
            wsFilter = equal("workspace.id", workspace.getId());
        }

        Filter filter = and(nameFilter, wsFilter);
        StyleInfo info = findUnique(StyleInfo.class, filter);
        return info;
    }

    @Override
    public List<StyleInfo> getStylesByWorkspace(WorkspaceInfo workspace) {
        if (workspace == null) {
            workspace = getDefaultWorkspace();
        }
        if (workspace == null) {
            return Collections.emptyList();
        }
        Filter filter;
        if (NO_WORKSPACE == workspace) {
            filter = isNull("workspace.id");
        } else {
            filter = equal("workspace.id", workspace.getId());
        }
        return db.queryAsList(StyleInfo.class, filter, null, null, null);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#syncTo(org.geoserver.catalog.CatalogFacade)
     */
    @Override
    public void syncTo(CatalogFacade other) {

        for (WorkspaceInfo w : getWorkspaces()) {
            other.add(w);
        }

        for (NamespaceInfo ns : getNamespaces()) {
            other.add(ns);
        }

        for (StoreInfo s : getStores(StoreInfo.class)) {
            other.add(s);
        }

        for (ResourceInfo r : getResources(ResourceInfo.class)) {
            other.add(r);
        }

        for (StyleInfo s : getStyles()) {
            other.add(s);
        }

        for (LayerInfo l : getLayers()) {
            other.add(l);
        }
        for (LayerGroupInfo lg : getLayerGroups()) {
            other.add(lg);
        }

        for (MapInfo m : getMaps()) {
            other.add(m);
        }

        other.setDefaultWorkspace(getDefaultWorkspace());
        other.setDefaultNamespace(getDefaultNamespace());

        for (WorkspaceInfo ws : getWorkspaces()) {
            DataStoreInfo defaultDataStore = getDefaultDataStore(ws);
            if (defaultDataStore != null) {
                other.setDefaultDataStore(ws, defaultDataStore);
            }
        }

    }

    private <T extends CatalogInfo> T findUnique(Class<T> type, Filter filter)
            throws IllegalArgumentException {

        final Integer count = Integer.valueOf(2);
        CloseableIterator<T> it = list(type, filter, null, count, (SortBy[])null);
        T result = null;
        try {
            if (it.hasNext()) {
                result = it.next();
                if (it.hasNext()) {
                    throw new IllegalArgumentException(
                            "Specified query predicate resulted in more than one object");
                }
            }
        } finally {
            it.close();
        }
        return result;
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#count(java.lang.Class,
     *      org.geoserver.catalog.Predicate)
     */
    @Override
    public <T extends CatalogInfo> int count(Class<T> of, Filter filter) {
        return db.count(of, filter);
    }

    @Override
    public boolean canSort(Class<? extends CatalogInfo> type, String propertyName) {
        boolean canSort = db.canSort(type, propertyName);
        return canSort;
    }

    @Override
    public <T extends CatalogInfo> CloseableIterator<T> list(Class<T> of,
            Filter filter, Integer offset, Integer count, SortBy sortOrder) {
        return list(of, filter, offset, count, sortOrder != null ? new SortBy[]{sortOrder}:null);
    }

    /**
     * @see org.geoserver.catalog.CatalogFacade#list(java.lang.Class,
     *      org.geoserver.catalog.Predicate, java.lang.Integer, java.lang.Integer)
     */
    @Override
    public <T extends CatalogInfo> CloseableIterator<T> list(final Class<T> of,
            final Filter filter, @Nullable final Integer offset, @Nullable final Integer count,
            @Nullable final SortBy... sortBy) {

        if(sortBy!=null) {
            for(SortBy sortOrder: sortBy){
                Preconditions.checkArgument(
                        null == sortOrder || canSort(of, sortOrder.getPropertyName().getPropertyName()),
                        "Can't sort objects of type %s by %s", of, sortOrder);
            }
        }
        return db.query(of, filter, offset, count, sortBy);

    }

    public <T extends CatalogInfo> void saveInternal(T info, Class<T> type) {
        Assert.notNull(info);
        Assert.notNull(info.getId(), "Can't modify a CatalogInfo with no id");

        beforeSaved(info);
        commitProxy(info);
        afterSaved(info);
    }

    protected void beforeSaved(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<String> propertyNames = h.getPropertyNames();
        List<Object> newValues = h.getNewValues();
        List<Object> oldValues = h.getOldValues();

        // TODO: protect this original object, perhaps with another proxy
        getCatalog().fireModified(real, propertyNames, oldValues, newValues);
    }

    protected <T extends CatalogInfo> T commitProxy(T object) {

        // get the real object
        T real = db.save(object);

        return real;
    }

    protected void afterSaved(CatalogInfo object) {
        CatalogInfo real = ModificationProxy.unwrap(object);

        // fire the post modify event
        getCatalog().firePostModified(real);
    }

    private <T extends CatalogInfo> T getByName(final String name, final Class<T> clazz) {

        Filter filter = equal("name", name);

        try {
            return findUnique(clazz, filter);
        } catch (IllegalArgumentException multipleResults) {
            return null;
        }
    }

    private <T extends CatalogInfo> T addInternal(T info) {
        Assert.notNull(info);

        Class<T> clazz = ClassMappings.fromImpl(info.getClass()).getInterface();

        setId(info, clazz);

        T added = db.add(info);

        return added;
    }

    private void setId(CatalogInfo info, Class<? extends CatalogInfo> type) {
        final String curId = info.getId();

        final String id;

        if (null != curId) {
            // HACK: is it imported from the DefaultCatalogFacade?
            // final String match = "Impl-";
            // int index = curId.indexOf(match);
            // if (index == -1) {
            // throw new IllegalArgumentException(
            // "Attempting to set id on an object already identified (" + curId + "): "
            // + info);
            // }
            id = curId;
        } else {
            String newId = UUID.randomUUID().toString();
            id = type.getSimpleName() + "." + newId;
        }

        OwsUtils.set(info, "id", id);
    }

}
TOP

Related Classes of org.geoserver.jdbcconfig.catalog.JDBCCatalogFacade

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.