/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.geofence.gui.server.service.impl; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import com.extjs.gxt.ui.client.data.PagingLoadResult; import org.geoserver.geofence.core.model.LayerDetails; import org.geoserver.geofence.gui.client.ApplicationException; import org.geoserver.geofence.gui.client.configuration.WorkspaceConfigOpts; import org.geoserver.geofence.gui.client.model.GSInstanceModel; import org.geoserver.geofence.gui.client.model.RuleModel; import org.geoserver.geofence.gui.client.model.data.Layer; import org.geoserver.geofence.gui.client.model.data.LayerStyle; import org.geoserver.geofence.gui.client.model.data.WorkspaceModel; import org.geoserver.geofence.gui.client.model.data.rpc.RpcPageLoadResult; import org.geoserver.geofence.gui.server.service.IWorkspacesManagerService; import org.geoserver.geofence.gui.service.GeofenceRemoteService; import org.geoserver.geofence.services.exception.NotFoundServiceEx; import it.geosolutions.geoserver.rest.GeoServerRESTReader; import it.geosolutions.geoserver.rest.decoder.RESTAbstractList; import it.geosolutions.geoserver.rest.decoder.RESTLayer; import it.geosolutions.geoserver.rest.decoder.RESTStyleList; import it.geosolutions.geoserver.rest.decoder.RESTWorkspaceList; import it.geosolutions.geoserver.rest.decoder.RESTWorkspaceList.RESTShortWorkspace; import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem; import java.util.SortedSet; import java.util.TreeSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; // TODO: Auto-generated Javadoc /** * The Class WorkspacesManagerServiceImpl. */ @Component("workspacesManagerServiceGWT") public class WorkspacesManagerServiceImpl implements IWorkspacesManagerService { /** The logger. */ private final Logger logger = LoggerFactory.getLogger(this.getClass()); /** The geofence remote service. */ @Autowired private GeofenceRemoteService geofenceRemoteService; /** The geofence workspace options. */ @Autowired private WorkspaceConfigOpts workspaceConfigOpts; /* * (non-Javadoc) * * @see * org.geoserver.geofence.gui.server.service.IWorkspacesManagerService#getWorkspaces(com.extjs * .gxt.ui.client.data.PagingLoadConfig, java.lang.String) */ public PagingLoadResult<WorkspaceModel> getWorkspaces(int offset, int limit, String remoteURL, GSInstanceModel gsInstance) throws ApplicationException { List<WorkspaceModel> workspacesListDTO = new ArrayList<WorkspaceModel>(); workspacesListDTO.add(new WorkspaceModel("*")); if ((remoteURL != null) && !remoteURL.equals("*") && !remoteURL.contains("?")) { try { GeoServerRESTReader gsreader = new GeoServerRESTReader(remoteURL, gsInstance.getUsername(), gsInstance.getPassword()); RESTWorkspaceList workspaces = gsreader.getWorkspaces(); if ((workspaces != null) && !workspaces.isEmpty()) { Iterator<RESTShortWorkspace> wkIT = workspaces.iterator(); while (wkIT.hasNext()) { RESTShortWorkspace workspace = wkIT.next(); workspacesListDTO.add(new WorkspaceModel(workspace.getName())); } } } catch (MalformedURLException e) { logger.error(e.getLocalizedMessage(), e); throw new ApplicationException(e.getLocalizedMessage(), e); } } return new RpcPageLoadResult<WorkspaceModel>(workspacesListDTO, 0, workspacesListDTO.size()); } /* * (non-Javadoc) * * @see * org.geoserver.geofence.gui.server.service.IWorkspacesManagerService#getLayers(com.extjs. * gxt.ui.client.data.PagingLoadConfig, java.lang.String, java.lang.String) */ public PagingLoadResult<Layer> getLayers(int offset, int limit, String baseURL, GSInstanceModel gsInstance, String workspace, String service) throws ApplicationException { List<Layer> layersListDTO = new ArrayList<Layer>(); layersListDTO.add(new Layer("*")); if ((baseURL != null) && !baseURL.equals("*") && !baseURL.contains("?") && (workspace != null) && (workspace.length() > 0)) { try { GeoServerRESTReader gsreader = new GeoServerRESTReader(baseURL, gsInstance.getUsername(), gsInstance.getPassword()); if (workspace.equals("*") && workspaceConfigOpts.isShowDefaultGroups() && service.equals("WMS")) { RESTAbstractList<NameLinkElem> layerGroups = gsreader.getLayerGroups(); if ((layerGroups != null)) { for (NameLinkElem lg : layerGroups) { // RESTLayerGroup group = gsreader.getLayerGroup(lg.getName()); // if (group != null) // { // layersListDTO.add(new Layer(group.getName())); // } layersListDTO.add(new Layer(lg.getName())); } } } else { SortedSet<String> sortedLayerNames = new TreeSet<String>(); RESTAbstractList<NameLinkElem> layers = gsreader.getLayers(); if (workspace.equals("*")) { // load all layers if (layers != null) for (NameLinkElem layerLink : layers) { sortedLayerNames.add(layerLink.getName()); } } else { if ((layers != null) && !layers.isEmpty()) { for (NameLinkElem layerNL : layers) { // next block is really too slow RESTLayer layer = gsreader.getLayer(layerNL.getName()); if(layer.getResourceUrl().contains("workspaces/" + workspace + "/")) { sortedLayerNames.add(layerNL.getName()); //layersListDTO.add(new Layer(layerNL.getName())); } } } } // return the sorted layers list for (String layerName : sortedLayerNames) { layersListDTO.add(new Layer(layerName)); } } } catch (MalformedURLException e) { logger.error(e.getLocalizedMessage(), e); throw new ApplicationException(e.getLocalizedMessage(), e); } } return new RpcPageLoadResult<Layer>(layersListDTO, 0, layersListDTO.size()); } /* * (non-Javadoc) * * @see * org.geoserver.geofence.gui.server.service.IWorkspacesManagerService#getStyles(org.geoserver * .geofence.gui.client.model.GSInstance) */ public List<LayerStyle> getStyles(RuleModel rule) throws ApplicationException { List<LayerStyle> layerStyles = new ArrayList<LayerStyle>(); Set<String> allowedStyles = null; int size = 0; try { LayerDetails layerDetails = geofenceRemoteService.getRuleAdminService().get(rule.getId()).getLayerDetails(); if (layerDetails != null) { allowedStyles = layerDetails.getAllowedStyles(); if (allowedStyles != null) { size = allowedStyles.size(); } } GeoServerRESTReader gsreader = new GeoServerRESTReader(rule.getInstance().getBaseURL(), rule.getInstance().getUsername(), rule.getInstance().getPassword()); RESTStyleList styles = gsreader.getStyles(); List<String> names = styles.getNames(); Iterator<String> iterator = names.iterator(); while (iterator.hasNext()) { String name = iterator.next(); LayerStyle layerStyle = new LayerStyle(); if (size > 0) { Iterator<String> styleIterator = allowedStyles.iterator(); while (styleIterator.hasNext()) { String allowed = styleIterator.next(); if (allowed.equalsIgnoreCase(name)) { layerStyle.setEnabled(true); } } } else { layerStyle.setEnabled(false); } layerStyle.setStyle(name); layerStyles.add(layerStyle); } } catch (MalformedURLException e) { logger.error(e.getLocalizedMessage(), e); throw new ApplicationException(e.getLocalizedMessage(), e); } catch (NotFoundServiceEx e) { logger.error(e.getLocalizedMessage(), e); throw new ApplicationException(e.getLocalizedMessage(), e); } return layerStyles; } }