/**
*
* geo-platform
* Rich webgis framework
* http://geo-platform.org
* ====================================================================
*
* Copyright (C) 2008-2017 geoSDI Group (CNR IMAA - Potenza - ITALY).
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. This program is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License
* for more details. You should have received a copy of the GNU General
* Public License along with this program. If not, see http://www.gnu.org/licenses/
*
* ====================================================================
*
* Linking this library statically or dynamically with other modules is
* making a combined work based on this library. Thus, the terms and
* conditions of the GNU General Public License cover the whole combination.
*
* As a special exception, the copyright holders of this library give you permission
* to link this library with independent modules to produce an executable, regardless
* of the license terms of these independent modules, and to copy and distribute
* the resulting executable under terms of your choice, provided that you also meet,
* for each linked independent module, the terms and conditions of the license of
* that module. An independent module is a module which is not derived from or
* based on this library. If you modify this library, you may extend this exception
* to your version of the library, but you are not obligated to do so. If you do not
* wish to do so, delete this exception statement from your version.
*/
package org.geosdi.geoplatform.gui.server.service.converter;
import com.google.common.collect.Lists;
import it.geosolutions.geoserver.rest.GeoServerRESTReader;
import org.geosdi.geoplatform.core.model.GPBBox;
import org.geosdi.geoplatform.core.model.GPFolder;
import org.geosdi.geoplatform.core.model.GPProject;
import org.geosdi.geoplatform.gui.client.model.memento.save.bean.MementoFolder;
import org.geosdi.geoplatform.gui.client.model.projects.GPClientProject;
import org.geosdi.geoplatform.gui.client.widget.time.LayerTimeFilterWidget;
import org.geosdi.geoplatform.gui.configuration.map.client.geometry.BBoxClientInfo;
import org.geosdi.geoplatform.gui.configuration.map.client.layer.*;
import org.geosdi.geoplatform.gui.model.tree.GPStyleStringBeanModel;
import org.geosdi.geoplatform.gui.model.user.GPSimpleUser;
import org.geosdi.geoplatform.gui.shared.GPLayerType;
import org.geosdi.geoplatform.response.*;
import org.geosdi.geoplatform.response.collection.TreeFolderElements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
* Simple Class to convert Web-Services beans model in DTO beans Client.
*
* @author Giuseppe La Scaleia - CNR IMAA geoSDI Group
* @email giuseppe.lascaleia@geosdi.org
*/
@Component(value = "dtoLayerConverter")
public class DTOLayerConverter {
private static SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy");
//
private GeoServerRESTReader sharedRestReader;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
public void setRestReader(
@Qualifier(value = "sharedRestReader") GeoServerRESTReader sharedRestReader) {
this.sharedRestReader = sharedRestReader;
}
public ArrayList<GPFolderClientInfo> convertOnlyFolders(
Collection<FolderDTO> folders) {
ArrayList<GPFolderClientInfo> foldersClient = Lists.<GPFolderClientInfo>newArrayList();
if (folders != null) {
for (Iterator<FolderDTO> it = folders.iterator(); it.hasNext();) {
GPFolderClientInfo folder = this.convertFolderElement(it.next());
foldersClient.add(folder);
}
}
return foldersClient;
}
private List<IGPFolderElements> convertFolderElements(
List<AbstractElementDTO> folderElements) {
List<IGPFolderElements> clientFolderElements = Lists.<IGPFolderElements>newArrayList();
Iterator<AbstractElementDTO> iterator = folderElements.iterator();
while (iterator.hasNext()) {
clientFolderElements.add(this.convertElement(iterator.next()));
}
return clientFolderElements;
}
public ArrayList<IGPFolderElements> convertFolderElements(
TreeFolderElements folderElements) {
ArrayList<IGPFolderElements> clientFolderElements = Lists.<IGPFolderElements>newArrayList();
Iterator<AbstractElementDTO> iterator = folderElements.iterator();
while (iterator.hasNext()) {
IElementDTO elementDTO = iterator.next();
logger.debug("@@@@@@@@@@@@@@@@@@ Element in HashSet {}", elementDTO);
clientFolderElements.add(this.convertElement(elementDTO));
}
return clientFolderElements;
}
private IGPFolderElements convertElement(IElementDTO element) {
IGPFolderElements folderElement = null;
if (element instanceof RasterLayerDTO) {
folderElement = this.convertRasterElement((RasterLayerDTO) element);
} else if (element instanceof VectorLayerDTO) {
folderElement = this.convertVectorElement(
(VectorLayerDTO) element);
} else if (element instanceof FolderDTO) {
folderElement = this.convertFolderElement((FolderDTO) element);
}
return folderElement;
}
private ClientRasterInfo convertRasterElement(RasterLayerDTO rasterDTO) {
ClientRasterInfo raster = new ClientRasterInfo();
this.convertToLayerElementFromLayerDTO(raster, rasterDTO);
raster.setLayerType(GPLayerType.WMS);
raster.setOpacity(rasterDTO.getOpacity());
raster.setMaxScale(rasterDTO.getMaxScale());
raster.setMinScale(rasterDTO.getMinScale());
ArrayList<GPStyleStringBeanModel> styles = Lists.<GPStyleStringBeanModel>newArrayList();
GPStyleStringBeanModel style;
for (String styleString : rasterDTO.getStyleList()) {
style = new GPStyleStringBeanModel();
style.setStyleString(styleString);
styles.add(style);
}
raster.setStyles(styles);
return raster;
}
private ClientVectorInfo convertVectorElement(VectorLayerDTO vectorDTO) {
ClientVectorInfo vector = new ClientVectorInfo();
this.convertToLayerElementFromLayerDTO(vector, vectorDTO);
this.setVectorLayerType(vector, vectorDTO.getLayerType());
vector.setFeatureType(vectorDTO.getName());
return vector;
}
private void convertToLayerElementFromLayerDTO(GPLayerClientInfo layer,
ShortLayerDTO layerDTO) {
layer.setAbstractText(layerDTO.getAbstractText());
layer.setBbox(this.convertBbox(layerDTO.getBbox()));
layer.setChecked(layerDTO.isChecked());
layer.setCrs(layerDTO.getSrs());
layer.setDataSource(layerDTO.getUrlServer());
layer.setId(layerDTO.getId());
layer.setLayerName(layerDTO.getName());
layer.setTitle(layerDTO.getTitle());
layer.setAlias(layerDTO.getAlias());
layer.setCqlFilter(layerDTO.getCqlFilter());
layer.setSingleTileRequest(layerDTO.isSingleTileRequest());
if ((layerDTO.getTimeFilter() != null) && !(layerDTO.getTimeFilter().equals(
""))) {
layer.setTimeFilter(layerDTO.getTimeFilter());
try {
String dimension = this.sharedRestReader.getDimensions(
layerDTO.getTitle());
if ((dimension != null) && (!dimension.contains("<h2>"))) {
List<String> dimensionList = Lists.<String>newArrayList(
dimension.split(","));
String[] timeFilterSplitted = layerDTO.getTimeFilter().split(
"/");
int startDimensionPosition = Integer.parseInt(
timeFilterSplitted[0]);
String variableTimeFilter = dimensionList.get(
dimensionList.size() - startDimensionPosition - 1);
if (timeFilterSplitted.length > 1) {
int endDimensionPosition = Integer.parseInt(
timeFilterSplitted[1]);
variableTimeFilter += "/" + dimensionList.get(
dimensionList.size() - endDimensionPosition - 1);
}
layer.setVariableTimeFilter(variableTimeFilter);
String layerAlias;
if (layerDTO.getAlias() != null
&& layerDTO.getAlias().indexOf(
LayerTimeFilterWidget.LAYER_TIME_DELIMITER) != -1) {
layerAlias = layerDTO.getAlias().substring(0,
layerDTO.getAlias().indexOf(
LayerTimeFilterWidget.LAYER_TIME_DELIMITER));
} else {
layerAlias = layerDTO.getTitle();
}
layer.setAlias(
layerAlias + LayerTimeFilterWidget.LAYER_TIME_DELIMITER
+ layer.getVariableTimeFilter() + "]");
}
} catch (NumberFormatException nfe) {
} catch (MalformedURLException nfe) {
logger.error(
"Impossible to retrieve time filter executing call with "
+ "geoServerManager: " + nfe);
}
}
// layer.setzIndex(layerDTO.getPosition());
}
private GPFolderClientInfo convertFolderElement(FolderDTO folderDTO) {
GPFolderClientInfo folder = new GPFolderClientInfo();
folder.setLabel(folderDTO.getName());
folder.setId(folderDTO.getId());
// folder.setzIndex(folderDTO.getPosition());
folder.setNumberOfDescendants(folderDTO.getNumberOfDescendants());
folder.setChecked(folderDTO.isChecked());
folder.setExpanded(folderDTO.isExpanded());
folder.setFolderElements(this.convertFolderElements(
folderDTO.getElementList()));
return folder;
}
private BBoxClientInfo convertBbox(GPBBox gpBbox) {
return new BBoxClientInfo(gpBbox.getMinX(), gpBbox.getMinY(),
gpBbox.getMaxX(), gpBbox.getMaxY());
}
private void setVectorLayerType(ClientVectorInfo vector,
GPLayerType layerType) {
switch (layerType) {
case POINT:
vector.setLayerType(GPLayerType.POINT);
break;
case LINESTRING:
vector.setLayerType(GPLayerType.LINESTRING);
break;
case POLYGON:
vector.setLayerType(GPLayerType.POLYGON);
break;
case MULTIPOINT:
vector.setLayerType(GPLayerType.MULTIPOINT);
break;
case MULTILINESTRING:
vector.setLayerType(GPLayerType.MULTILINESTRING);
break;
case MULTIPOLYGON:
vector.setLayerType(GPLayerType.MULTIPOLYGON);
break;
default:
System.out.println("### No Layer Type ###");
}
}
public GPFolder convertMementoFolder(MementoFolder memento) {
GPFolder gpFolder = new GPFolder();
gpFolder.setId(memento.getIdBaseElement());
gpFolder.setName(memento.getFolderName());
gpFolder.setNumberOfDescendants(memento.getNumberOfDescendants());
// if (memento.getIdParent() != null) {
// GPFolder parent = new GPFolder();
// parent.setId(memento.getIdParent());
// gpFolder.setParent(parent);
// }
gpFolder.setPosition(memento.getzIndex());
/*
* TODO: Once implemented shared function you must set this property
* gpFolder.setShared(true);
*/
return gpFolder;
}
public GPProject convertToGProject(GPClientProject clientProject) {
GPProject project = new GPProject();
project.setName(clientProject.getName());
project.setShared(clientProject.isShared());
return project;
}
public AccountProjectPropertiesDTO convertToAccountProjectPropertiesDTO(
Long accountID,
GPClientProject project) {
AccountProjectPropertiesDTO dto = new AccountProjectPropertiesDTO();
dto.setAccountID(accountID);
dto.setProjectID(project.getId());
dto.setProjectName(project.getName());
dto.setProjectVersion(project.getVersion());
dto.setDefaultProject(project.isDefaultProject());
dto.setShared(project.isShared());
return dto;
}
public GPClientProject convertToGPClientProject(ProjectDTO projectDTO) {
GPClientProject clientProject = new GPClientProject();
clientProject.setId(projectDTO.getId());
clientProject.setName(projectDTO.getName());
clientProject.setVersion(projectDTO.getVersion());
clientProject.setNumberOfElements(projectDTO.getNumberOfElements());
clientProject.setCreationDate(dateFormatter.format(projectDTO.getCreationDate()));
if (projectDTO.isDefault() != null) {
clientProject.setDefaultProject(projectDTO.isDefault());
}
if (projectDTO.isShared() != null) {
clientProject.setShared(projectDTO.isShared());
}
ShortAccountDTO owner = projectDTO.getOwner();
if (owner != null && owner instanceof UserDTO) {
clientProject.setOwner(this.convertToGPSimpleUser((UserDTO) owner));
}
clientProject.setRootFolders(this.convertOnlyFolders(
projectDTO.getRootFolders()));
return clientProject;
}
public GPClientProject convertToGPCLientProject(ProjectDTO projectDTO,
String imageURL) {
GPClientProject clientProject = this.convertToGPClientProject(projectDTO);
clientProject.setImage(imageURL);
return clientProject;
}
public List<GPSimpleUser> convertToGPSimpleUser(
List<ShortAccountDTO> shortAccountList) {
List<GPSimpleUser> listSimpleUser = Lists.<GPSimpleUser>newArrayList();
for (ShortAccountDTO shortAccont : shortAccountList) {
if (shortAccont instanceof UserDTO) {
listSimpleUser.add(this.convertToGPSimpleUser(
(UserDTO) shortAccont));
}
}
return listSimpleUser;
}
private GPSimpleUser convertToGPSimpleUser(UserDTO userDTO) {
GPSimpleUser user = new GPSimpleUser();
user.setId(userDTO.getId());
user.setOrganization(userDTO.getOrganization());
user.setName(userDTO.getName());
user.setUsername(userDTO.getUsername());
user.setEmail(userDTO.getEmailAddress());
return user;
}
}