geoportal-data-viewer-app/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerServiceI...

868 lines
32 KiB
Java

package org.gcube.portlets.user.geoportaldataviewer.server;
import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.projects;
import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.useCaseDescriptors;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.bson.Document;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Index;
import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.model.legacy.UploadedImage;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
import org.gcube.application.geoportal.common.rest.Projects;
import org.gcube.application.geoportalcommon.ConvertToDataValueObjectModel;
import org.gcube.application.geoportalcommon.ConvertToDataViewModel;
import org.gcube.application.geoportalcommon.GeoportalCommon;
import org.gcube.application.geoportalcommon.shared.GNADataViewerConfigProfile;
import org.gcube.application.geoportalcommon.shared.GeoNaItemRef;
import org.gcube.application.geoportalcommon.shared.LayerItem;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV;
import org.gcube.application.geoportalcommon.shared.gis.BoundsMap;
import org.gcube.application.geoportalcommon.shared.products.model.UploadedImageDV;
import org.gcube.application.geoportalcommon.util.URLParserUtil;
import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerService;
import org.gcube.portlets.user.geoportaldataviewer.server.faults.InvalidObjectException;
import org.gcube.portlets.user.geoportaldataviewer.server.gis.FeatureParser;
import org.gcube.portlets.user.geoportaldataviewer.server.gis.WMSUrlValidator;
import org.gcube.portlets.user.geoportaldataviewer.server.mongoservice.ConcessioniMongoServiceIdentityProxy;
import org.gcube.portlets.user.geoportaldataviewer.server.util.ContextRequest;
import org.gcube.portlets.user.geoportaldataviewer.server.util.DVConversion;
import org.gcube.portlets.user.geoportaldataviewer.server.util.SessionUtil;
import org.gcube.portlets.user.geoportaldataviewer.shared.GCubeCollection;
import org.gcube.portlets.user.geoportaldataviewer.shared.GeoNaSpatialQueryResult;
import org.gcube.portlets.user.geoportaldataviewer.shared.ViewerConfiguration;
import org.gcube.portlets.user.geoportaldataviewer.shared.faults.ControlledError;
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer;
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.IndexLayer;
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerObject;
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wfs.FeatureRow;
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wms.GeoInformationForWMSRequest;
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wms.Styles;
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wms.ZAxis;
import org.gcube.portlets.user.urlshortener.UrlShortener;
import org.gcube.spatial.data.geoutility.GeoNcWMSMetadataUtility;
import org.gcube.spatial.data.geoutility.bean.LayerStyles;
import org.gcube.spatial.data.geoutility.bean.LayerZAxis;
import org.gcube.spatial.data.geoutility.bean.WmsParameters;
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
/**
* The server side implementation of the RPC service.
*
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
*
* Nov 12, 2020
*/
@SuppressWarnings("serial")
public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet implements GeoportalDataViewerService {
public static final String PRODUCT_ID = "product_id";
/** The Constant LOG. */
private static final Logger LOG = LoggerFactory.getLogger(GeoportalDataViewerServiceImpl.class);
private static final String CACHE_IMAGE_PREVIEW_FOR_CONCESSIONE = "MAP_IMAGE_PREVIEW_FOR_CONCESSIONE";
/**
* Gets the GNA data viewe config profile.
*
* @return the GNA data viewe config profile
* @throws Exception the exception
*/
private GNADataViewerConfigProfile getGNADataVieweConfigProfile() throws Exception {
LOG.info("METHOD getDataResult called");
GNADataViewerConfigProfile profile = SessionUtil.getGNADataViewerConfigProfile(getThreadLocalRequest());
if (profile == null) {
LOG.info(GNADataViewerConfigProfile.class.getSimpleName() + " is null, loading configurations from IS");
// to be sure
SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true);
GeoportalCommon geoportalComm = new GeoportalCommon();
profile = geoportalComm.readGNADataViewerConfig(null);
} else {
LOG.info(GNADataViewerConfigProfile.class.getSimpleName() + " read from session");
}
return profile;
}
/**
* Parses the wms request.
*
* @param wmsRequest the wms request
* @param layerName the layer name
* @return the geo information for WMS request
* @throws Exception the exception
*/
@Override
public GeoInformationForWMSRequest parseWmsRequest(String wmsRequest, String layerName) throws Exception {
return loadGeoInfoForWmsRequest(wmsRequest, layerName);
}
/**
* Load geo info for wms request.
*
* @param wmsLink the wms link
* @param layerName the layer name
* @return the geo information for WMS request
* @throws Exception the exception
*/
public GeoInformationForWMSRequest loadGeoInfoForWmsRequest(String wmsLink, String layerName) throws Exception {
try {
LOG.info("METHOD load GEO infor for WMS Req called");
WMSUrlValidator validator = new WMSUrlValidator(wmsLink, layerName);
String wmsServiceHost = validator.getWmsServiceHost();
String validWMSRequest = validator.parseWMSRequest(true, true);
layerName = validator.getLayerName();
String versionWms = validator.getValueOfParsedWMSParameter(WmsParameters.VERSION);
String crs = validator.getValueOfParsedWMSParameter(WmsParameters.CRS);
//
HashMap<String, String> mapWmsNotStandard = new HashMap<String, String>();
if (validator.getMapWmsNoStandardParams() != null) {
mapWmsNotStandard.putAll(validator.getMapWmsNoStandardParams());
}
//
GeoNcWMSMetadataUtility geoGS = new GeoNcWMSMetadataUtility(validWMSRequest, 4000);
// STYLES
LayerStyles layerStyle = geoGS.loadStyles();
Map<String, String> mapNcWmsStyles = layerStyle.getMapNcWmsStyles() == null ? new HashMap<String, String>(1)
: layerStyle.getMapNcWmsStyles();
mapWmsNotStandard.putAll(mapNcWmsStyles);
// MAP STYLES INTO GWT-SERIALIZABLE OBJECT
Styles styles = new Styles(layerStyle.getGeoStyles(), layerStyle.getMapNcWmsStyles(), layerStyle.isNcWms());
// ZAxis
LayerZAxis layerZAxis = geoGS.loadZAxis();
// MAP ZAXIS INTO GWT-SERIALIZABLE OBJECT
ZAxis zAxis = layerZAxis != null
? new ZAxis(layerZAxis.getUnits(), layerZAxis.isPositive(), layerZAxis.getValues())
: null;
return new GeoInformationForWMSRequest(wmsServiceHost, validWMSRequest, layerName, versionWms, crs,
mapWmsNotStandard, styles, styles.isNcWms(), zAxis);
} catch (Exception e) {
String msg = "An error occurred during wms request validation for layer: " + layerName;
LOG.error(msg, e);
throw new Exception(msg);
}
}
/**
* Gets the data result.
*
* @param layerObjects the layer objects
* @param mapSrsName the map srs name
* @param selectBBOX the select BBOX
* @param maxWFSFeature the max WFS feature
* @param zoomLevel the zoom level
* @return the data result
*/
@Override
public List<GeoNaSpatialQueryResult> getDataResult(List<LayerObject> layerObjects, String mapSrsName,
BoundsMap selectBBOX, int maxWFSFeature, double zoomLevel) {
LOG.info("METHOD getDataResult called");
List<GeoNaSpatialQueryResult> listDAO = new ArrayList<GeoNaSpatialQueryResult>(layerObjects.size());
for (LayerObject layerObject : layerObjects) {
GeoNaSpatialQueryResult geoDAO = new GeoNaSpatialQueryResult();
List<FeatureRow> features = FeatureParser.getWFSFeatures(layerObject.getLayerItem(), mapSrsName, selectBBOX,
maxWFSFeature);
LOG.debug("For layer name: " + layerObject.getLayerItem().getName() + " got features: " + features);
geoDAO.setFeatures(features);
// Getting the concessioneId from WFS features
for (FeatureRow fRow : features) {
if (fRow.getMapProperties() != null) {
List<String> concessioneIds = fRow.getMapProperties().get("product_id");
if (concessioneIds != null && concessioneIds.size() > 0) {
String cId = concessioneIds.get(0);
try {
UploadedImageDV uplImg = sessionloadPreviewImageForConcessione(this.getThreadLocalRequest(),
"Concessione", cId);
// List<UploadedImageDV> listUI = getUploadedImagesForId("Concessione", cId, 1);
Map<String, List<UploadedImageDV>> mapImages = new LinkedHashMap<String, List<UploadedImageDV>>();
mapImages.put(cId, Arrays.asList(uplImg));
// mapImages.put(cId, listUI);
geoDAO.setMapImages(mapImages);
} catch (Exception e) {
LOG.warn("Error on loading uploaded images for concessione: " + cId, e);
}
}
}
}
geoDAO.setSourceLayerObject(layerObject);
LOG.info("For layer name: " + layerObject.getLayerItem().getName() + " got " + features.size()
+ " feature/s");
listDAO.add(geoDAO);
}
LOG.info("returning " + listDAO + " geona data objects");
return listDAO;
}
/**
* Gets the uploaded images for id.
*
* @param itemType the item type
* @param itemId the item id. It is the mongoId
* @param maxImages the max images
* @return the uploaded images for id
* @throws Exception the exception
*/
@Override
public List<UploadedImageDV> getUploadedImagesForId(String itemType, String itemId, Integer maxImages)
throws Exception {
LOG.info("getUploadedImagesForId [itemId: " + itemId + ", itemType: " + itemType + "] called");
return getUploadedImagesForId(this.getThreadLocalRequest(), itemType, itemId, maxImages);
}
// /**
// * Gets the layers for id.
// *
// * @param itemType the item type
// * @param itemId the item id
// * @return the layers for id
// * @throws Exception the exception
// */
// @Override
// public List<LayerConcessioneDV> getLayersForId(String itemType, String itemId) throws Exception {
// LOG.info("getLayersForId [itemId: " + itemId + ", itemType: " + itemType + "] called");
//
// if (itemType == null)
// throw new Exception("Invalid parameter. The itemType is null");
//
// if (itemId == null)
// throw new Exception("Invalid parameter. The itemId is null");
//
// List<LayerConcessioneDV> listLayers = null;
//
// try {
//
// SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true);
// String userName = null;
// try {
// userName = SessionUtil.getCurrentUser(this.getThreadLocalRequest()).getUsername();
// } catch (Exception e) {
// LOG.info("User not found in session, the userName for cecking policy will be null");
// }
//
// if (itemType.equalsIgnoreCase("concessione")) {
//
// LOG.info("Trying to get concessione for id " + itemId);
// ConcessioniMongoServiceIdentityProxy cms = new ConcessioniMongoServiceIdentityProxy(
// this.getThreadLocalRequest());
// Concessione concessione = cms.getItemById(itemId);
//
// BaseConcessioneDV baseConcessione = ConvertToDataViewModel.toBaseConcessione(concessione);
// if (concessione != null) {
// LOG.info("For id " + itemId + ", got concessione " + concessione.getNome() + " from service");
// listLayers = new ArrayList<LayerConcessioneDV>();
// if (concessione.getPianteFineScavo() != null) {
//
// for (LayerConcessione lc : concessione.getPianteFineScavo()) {
// if (GeoNACheckAccessPolicy.isAccessible(lc.getPolicy().name(), userName)) {
// listLayers.add(ConvertToDataViewModel.toLayerConcessione(lc, baseConcessione));
// }
// }
//
// LayerConcessione lcPosizionamento = concessione.getPosizionamentoScavo();
//
// if (lcPosizionamento != null) {
//
// if (GeoNACheckAccessPolicy.isAccessible(lcPosizionamento.getPolicy().name(), userName)) {
//
// LayerConcessioneDV thePosizScavo = ConvertToDataViewModel
// .toLayerConcessione(lcPosizionamento, baseConcessione);
// if (thePosizScavo != null)
// listLayers.add(thePosizScavo);
// }
// }
//
// }
//
// } else
// throw new Exception("Concessione with id '" + itemId + "' not available");
// }
// LOG.info("For id " + itemId + ", returning " + listLayers.size() + " layer/s");
// return listLayers;
//
// } catch (Exception e) {
// String erroMsg = "Layers are not available for " + Concessione.class.getSimpleName() + " with id " + itemId;
// LOG.error(erroMsg, e);
// throw new Exception(erroMsg);
// }
//
// }
// /**
// * Gets the concessione for id.
// *
// * @param mongoId the mongo id
// * @return the concessione for id
// * @throws Exception the exception
// */
// @Override
// public ConcessioneDV getConcessioneForId(String mongoId) throws Exception {
// LOG.info("getConcessioneForId " + mongoId + " called");
//
// ConcessioneDV concessionDV = null;
//
// if (mongoId == null)
// throw new Exception("Invalid parameter. The itemId is null");
//
// try {
// LOG.info("Trying to get record for id " + mongoId);
//
// ConcessioniMongoServiceIdentityProxy cms = new ConcessioniMongoServiceIdentityProxy(
// this.getThreadLocalRequest());
// Concessione concessione = cms.getItemById(mongoId);
//
// LOG.info("Got concessione for mongoId: " + mongoId);
// if (concessione != null) {
// concessionDV = ConvertToDataViewModel.toConcessione(concessione);
//
// String userName = null;
// try {
// userName = SessionUtil.getCurrentUser(this.getThreadLocalRequest()).getUsername();
//
// } catch (Exception e) {
// LOG.info("User not found in session, so going to apply the acess policies");
// }
//
// // TODO THIS IS A WORKAROUND WAITING FOR ADOPTING OF USER ROLES. AT THE MOMENT,
// // A USER AUTHENTICATED CAN ACCESS EVERYTHING
// // I CAN CHECK THE ACCCESS POLICIES IF AND ONLY IF THE USER IS NOT LOGGED IN.
// if (userName == null) {
//
// // CHECKING ACCESS POLICY
// LOG.info("Applying access policies for concessione " + mongoId + " returned by service");
// LayerConcessioneDV layerPosizionamento = concessionDV.getPosizionamentoScavo();
// if (layerPosizionamento != null) {
// if (!GeoNACheckAccessPolicy.isAccessible(layerPosizionamento.getPolicy(), userName)) {
// concessionDV.setPosizionamentoScavo(null);
// LOG.info("Posizionamento di Scavo is not accessible by current user: " + userName);
// }
// }
//
// List<LayerConcessioneDV> listLayersDV = concessionDV.getPianteFineScavo();
// if (listLayersDV != null) {
// List<LayerConcessioneDV> accessibleListLayersDV = new ArrayList<LayerConcessioneDV>();
// for (LayerConcessioneDV layerDV : listLayersDV) {
// if (GeoNACheckAccessPolicy.isAccessible(layerDV.getPolicy(), userName)) {
// accessibleListLayersDV.add(layerDV);
// } else {
// LOG.info("(Pianta) Layer " + layerDV.getLayerName()
// + " is not accessible by current user: " + userName);
// }
// }
// concessionDV.setPianteFineScavo(accessibleListLayersDV);
// }
//
// AbstractRelazioneScavoDV abstractRS = concessionDV.getAbstractRelazioneScavo();
// if (abstractRS != null) {
// if (!GeoNACheckAccessPolicy.isAccessible(abstractRS.getPolicy(), userName)) {
// concessionDV.setAbstractRelazioneScavo(null);
// LOG.info("Abstract relazione is not accessible by current user: " + userName);
// }
// }
//
// RelazioneScavoDV relazioneScavo = concessionDV.getRelazioneScavo();
// if (relazioneScavo != null) {
// if (!GeoNACheckAccessPolicy.isAccessible(relazioneScavo.getPolicy(), userName)) {
// concessionDV.setRelazioneScavo(null);
// LOG.info("Relazione scavo is not accessible by current user: " + userName);
// }
// }
//
// List<UploadedImageDV> immagini = concessionDV.getImmaginiRappresentative();
// if (immagini != null && immagini.size() > 0) {
// List<UploadedImageDV> accessibleListImages = new ArrayList<UploadedImageDV>();
//
// // SHOWING ACESSIBLE IMAGES
// for (UploadedImageDV uploadedImageDV : immagini) {
//
// if (GeoNACheckAccessPolicy.isAccessible(uploadedImageDV.getPolicy(), userName)) {
// accessibleListImages.add(uploadedImageDV);
// } else {
// LOG.info("Immagine " + uploadedImageDV.getTitolo()
// + " is not accessible by current user: " + userName);
// }
//
// }
// concessionDV.setImmaginiRappresentative(accessibleListImages);
//
// }
//
// // END CHECKING ACCESS POLICY
// LOG.info("Access policies applied");
// }
// }
//
// if (concessionDV == null)
// throw new Exception("Concessione with id '" + mongoId + "' not available");
//
// LOG.debug("For id " + mongoId + " returning " + ConcessioneDV.class.getSimpleName() + ": " + concessionDV);
// return concessionDV;
//
// } catch (Exception e) {
// String erroMsg = Concessione.class.getSimpleName() + " with id '" + mongoId + "' not available";
// LOG.error(erroMsg, e);
// throw new Exception(erroMsg);
// }
//
// }
/**
* Gets the parameters from URL.
*
* @param theURL the the URL
* @param parameters the parameters
* @return a map with couple (paramKey, paramValue)
*/
public Map<String, String> getParametersFromURL(String theURL, List<String> parameters) {
LOG.info("METHOD getPAramsFromURL");
if (theURL == null)
return null;
if (parameters == null || parameters.size() == 0)
return null;
Map<String, String> hashParameters = new HashMap<String, String>(parameters.size());
for (String paramKey : parameters) {
String paramValue = URLParserUtil.extractValueOfParameterFromURL(paramKey, theURL);
hashParameters.put(paramKey, paramValue);
}
return hashParameters;
}
/**
* Gets the my login.
*
* @return the my login
*/
@Override
public String getMyLogin() {
LOG.info("METHOD getMYLogin ");
try {
GCubeUser user = SessionUtil.getCurrentUser(this.getThreadLocalRequest());
if (user == null)
return null;
return user.getUsername();
} catch (Exception e) {
LOG.warn("Error on getting the login, am I out of portal? Returning null");
return null;
}
}
/**
* Gets the layer for type.
*
* @param layerType the layer type
* @return the layer for type
* @throws Exception the exception
*/
@Override
public GeoInformationForWMSRequest getLayerForType(String layerType) throws Exception {
LOG.info("Called getLayerForType for:" + layerType);
if (layerType == null || layerType.isEmpty())
throw new Exception("The input parameter layerType is null or empty");
SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true);
GNADataViewerConfigProfile profile = getGNADataVieweConfigProfile();
LOG.info("Read profile: " + profile);
String lowerLayerType = layerType.toLowerCase();
LOG.info("Reading map layers for type:" + lowerLayerType);
LayerItem layer = profile.getMapLayers().get(lowerLayerType);
if (layer == null || layer.getWmsLink() == null)
throw new Exception(
"The layer type " + lowerLayerType + " has not been found. Please check your input parameter");
if (layer.getWmsLink() == null)
throw new Exception("The layer type " + lowerLayerType
+ " has not a WMS Link associated. Please check your input parameter");
return parseWmsRequest(layer.getWmsLink(), null);
}
/**
* Gets the geo na data view profile.
*
* @return the geo na data view profile
* @throws Exception the exception
*/
@Override
public GNADataViewerConfigProfile getGeoNaDataViewProfile() throws Exception {
LOG.info("getGeoNaDataViewProfile called");
SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true);
GNADataViewerConfigProfile profile = getGNADataVieweConfigProfile();
LOG.info("Returning profile: " + profile);
return profile;
}
/**
* Gets the public links for.
*
* @param item the item
* @return the public links for
* @throws Exception the exception
*/
@Override
public GeoNaItemRef getPublicLinksFor(GeoNaItemRef item) throws Exception {
LOG.info("getPublicLinksFor called for: " + item);
try {
if (item == null)
throw new Exception("Bad request, the item is null");
if (item.getItemId() == null)
throw new Exception("Bad request, the item id is null");
if (item.getItemType() == null)
throw new Exception("Bad request, the item type is null");
SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true);
GeoportalCommon gc = new GeoportalCommon();
return gc.getPublicLinksFor(item, true);
} catch (Exception e) {
LOG.error("Error on getPublicLinksFor for: " + item, e);
throw new Exception("Share link not available for this item. Try later or contact the support. Error: "
+ e.getMessage());
}
}
/**
* Checks if is session expired.
*
* @return true, if is session expired
* @throws Exception the exception
*/
public boolean isSessionExpired() throws Exception {
LOG.info("METHOD isSessionExpired ");
return SessionUtil.isSessionExpired(this.getThreadLocalRequest());
}
/**
* Gets the WFS features.
*
* @param layerObjects the layer objects
* @param mapSrsName the map srs name
* @param selectBBOX the select BBOX
* @param maxWFSFeature the max WFS feature
* @param zoomLevel the zoom level
* @return the WFS features
*/
@Override
public List<GeoNaSpatialQueryResult> getWFSFeatures(List<LayerObject> layerObjects, String mapSrsName,
BoundsMap selectBBOX, int maxWFSFeature, double zoomLevel) {
LOG.info("getWFSFeatures called");
List<GeoNaSpatialQueryResult> listDAO = new ArrayList<GeoNaSpatialQueryResult>(layerObjects.size());
for (LayerObject layerObject : layerObjects) {
GeoNaSpatialQueryResult geoDAO = new GeoNaSpatialQueryResult();
List<FeatureRow> features = FeatureParser.getWFSFeatures(layerObject.getLayerItem(), mapSrsName, selectBBOX,
maxWFSFeature);
LOG.debug("For layer name: " + layerObject.getLayerItem().getName() + " got features: " + features);
geoDAO.setFeatures(features);
geoDAO.setSourceLayerObject(layerObject);
LOG.info("For layer name: " + layerObject.getLayerItem().getName() + " got " + features.size()
+ " feature/s");
listDAO.add(geoDAO);
}
LOG.info("returning " + listDAO + " geona data objects");
return listDAO;
}
/**
* Gets the preview image for concessione from http session. It is the first
* image retrieved from mongoService for mongoConcessioneId. Caching it into
* session
*
* @param httpServletRequest the http servlet request
* @param itemType the item type
* @param mongoConcessioneId the mongo concessione id
* @return the preview image for concessione
*/
private UploadedImageDV sessionloadPreviewImageForConcessione(HttpServletRequest httpServletRequest,
String itemType, String mongoConcessioneId) {
LOG.info("sessionloadPreviewImageForConcessione [mongoConcessioneId: " + mongoConcessioneId + ", itemType: "
+ itemType + "] called");
HttpSession session = httpServletRequest.getSession();
Map<String, List<UploadedImageDV>> mapImages = null;
List<UploadedImageDV> lUI = null;
try {
mapImages = (LinkedHashMap) session.getAttribute(CACHE_IMAGE_PREVIEW_FOR_CONCESSIONE);
if (mapImages == null) {
mapImages = new LinkedHashMap<String, List<UploadedImageDV>>();
}
List<UploadedImageDV> imagePreviewForConcessione = mapImages.get(mongoConcessioneId);
if (imagePreviewForConcessione == null || imagePreviewForConcessione.size() == 0) {
LOG.info("Into " + CACHE_IMAGE_PREVIEW_FOR_CONCESSIONE + " object session the mongoConcessioneId "
+ mongoConcessioneId + " is empty or null, loading from service and filling it");
lUI = getUploadedImagesForId(httpServletRequest, itemType, mongoConcessioneId, 1);
mapImages.put(mongoConcessioneId, lUI);
}
lUI = mapImages.get(mongoConcessioneId);
LOG.info("From " + CACHE_IMAGE_PREVIEW_FOR_CONCESSIONE + " object session read image: " + lUI);
session.setAttribute(CACHE_IMAGE_PREVIEW_FOR_CONCESSIONE, mapImages);
} catch (Exception e) {
LOG.warn("Error occurred when instancing the " + UrlShortener.class.getSimpleName(), e);
}
if (lUI == null || lUI.isEmpty())
return null;
return lUI.get(0);
}
/**
* Gets the uploaded images for id.
*
* @param httpServletRequest the http servlet request
* @param itemType the item type
* @param itemId the item id
* @param maxImages the max images
* @return the uploaded images for id
* @throws Exception the exception
*/
private List<UploadedImageDV> getUploadedImagesForId(HttpServletRequest httpServletRequest, String itemType,
String itemId, Integer maxImages) throws Exception {
LOG.info("getUploadedImagesForId [itemId: " + itemId + ", itemType: " + itemType + "] called");
if (itemType == null)
throw new Exception("Invalid parameter. The itemType is null");
if (itemId == null)
throw new Exception("Invalid parameter. The itemId is null");
List<UploadedImageDV> listUI = null;
try {
if (itemType.equalsIgnoreCase("concessione")) {
LOG.info("Trying to get concessione for id " + itemId);
ConcessioniMongoServiceIdentityProxy cms = new ConcessioniMongoServiceIdentityProxy(httpServletRequest);
Concessione concessione = cms.getItemById(itemId);
if (concessione != null) {
LOG.info("For id " + itemId + ", got concessione " + concessione.getNome() + " from service");
List<UploadedImage> images = concessione.getImmaginiRappresentative();
if (images != null) {
listUI = new ArrayList<UploadedImageDV>();
int max = maxImages < images.size() ? maxImages : images.size();
for (int i = 0; i < max; i++) {
UploadedImageDV ui = ConvertToDataViewModel.toUploadedImage(images.get(i));
listUI.add(ui);
}
LOG.info("For id " + itemId + ", got " + listUI.size() + " image/s");
}
} else
throw new Exception("Concessione with id '" + itemId + "' not available");
}
return listUI;
} catch (Exception e) {
String erroMsg = UploadedImage.class.getSimpleName() + " not available for "
+ Concessione.class.getSimpleName() + " with id " + itemId;
LOG.error(erroMsg, e);
throw new Exception(erroMsg);
}
}
// TODO THIS PART REQUIRES THE JSON MAPPING based on keys read from gCube Meta
// /**
// * List of fields for searching.
// *
// * @return the list
// * @throws Exception the exception
// */
// @Override
// public List<ItemField> listOfFieldsForSearching() throws Exception {
// LOG.info("listOfFieldsForSearching called");
// SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true);
// GNADataViewerConfigProfile profile = getGNADataVieweConfigProfile();
// return profile.getListItemFields();
// }
// /**
// * Gets the list concessioni.
// *
// * @param start the start
// * @param limit the limit
// * @param filter the filter
// * @param reloadFromService the reload from service
// * @return the list concessioni
// * @throws Exception the exception
// */
// @Override
// public ResultSetPaginatedData getListConcessioni(Integer start, Integer limit, SearchingFilter filter,
// boolean reloadFromService) throws Exception {
// LOG.info("getListConcessioni called wit start: " + start + ", limit: " + limit + ", filter: " + filter);
//
// try {
// // setting identity as D4S User or KC client
// new ConcessioniMongoServiceIdentityProxy(this.getThreadLocalRequest());
// SessionUtil.getCurrentContext(getThreadLocalRequest(), true);
// MongoServiceCommon serviceCommon = new MongoServiceCommon();
// // TODO MUST BE REPLACED BY COUNT
// List<Concessione> listOfConcessioni = SessionUtil.getListOfConcessioni(getThreadLocalRequest(),
// reloadFromService);
// int listConcessioniSize = listOfConcessioni.size();
//
// ResultSetPaginatedData searchedData = serviceCommon.queryOnMongo(listConcessioniSize, start, limit, filter,
// "concessione");
// return searchedData;
//
// } catch (Exception e) {
// LOG.error("Error on loading paginated and filtered list of concessioni: ", e);
// throw new Exception("Error occurred on loading list of Concessioni. Error: " + e.getMessage());
// }
//
// }
// ************************************** COLLECTIONS
@Override
public ViewerConfiguration getInitialConfiguration(Map<String,List<String>> parameters) throws Exception {
LOG.debug("Received Initial configuration request with params "+parameters);
return new ContextRequest<ViewerConfiguration>(this.getThreadLocalRequest()) {
@Override
protected ViewerConfiguration run() throws Exception, ControlledError {
try {
// ************* LOAD BASE LAYERS
final ViewerConfiguration config = new ViewerConfiguration();
LOG.info("Getting initial configuration ");
LOG.debug("Loading base layers..");
List<BaseMapLayer> listBL= SessionUtil.getGNABaseMaps(request);
LOG.debug("getListBaseLayers returning " + listBL.size() + " base maps");
config.setBaseLayers(listBL);
// ************** LOAD AVAILABLE COLLECTIONS
LOG.debug("Loading available collections.. ");
config.setAvailableCollections(new HashMap<String,GCubeCollection>());
// TODO filter by
// configured ?
// gis indexed
QueryRequest request = new QueryRequest();
// TODO Constant
String Id="org.gcube.portlets.user.geoportaldataviewer";
request.setFilter(Document.parse("{\""+UseCaseDescriptor.HANDLERS+"."+
org.gcube.application.geoportal.common.model.useCaseDescriptor.HandlerDeclaration.ID+"\" : "
+ "{\"$eq\" : \""+Id+"\"}}"));
useCaseDescriptors().build().query(new QueryRequest()).forEachRemaining(u->{
try{
LOG.debug("Checking configuration for collection "+u.getId());
Projects<Project> p=projects(u.getId()).build();
UseCaseDescriptorDV ucd = ConvertToDataValueObjectModel.toUseCaseDescriptorDV(u, null);
Configuration ucdConfig = p.getConfiguration();
GCubeCollection coll=new GCubeCollection();
coll.setUcd(ucd);
//TODO TO Check index flag should be in configuration or evaluated according to user credentials
String toCheckFlag = "internal";
// TODO constant
coll.setIndexes(new ArrayList());
LOG.debug("Checking if "+u.getId()+" is GIS Indexed. Index flag needed is "+toCheckFlag);
for(Index index : ucdConfig.getIndexes()) {
try {
IndexLayer toAdd = DVConversion.convert(index);
if(toAdd.getFlag().equals(toCheckFlag))
coll.getIndexes().add(toAdd);
}catch(InvalidObjectException e) {
LOG.debug("Skipping invalid index ",e);
}catch(Throwable t) {
LOG.error("Unable to check index ",t);
}
}
// Return only if gis indexed
if(coll.getIndexes().isEmpty())
LOG.info("No available GIS Index for collection "+coll.getUcd().getName());
else config.getAvailableCollections().put(coll.getUcd().getId(),coll);
}catch(Throwable t) {
LOG.warn("Invalid UCD, can't translate to DV. UCID : "+u.getId(),t);
}
});
// TODO load initial layers from query parameters
LOG.debug("Found "+config.getAvailableCollections().size()+" collections");
return config;
}catch(Throwable t) {
LOG.error("Unexpected exception while loading initial config",t);
throw new ControlledError("Unable to configure viewer. Please retry in a few minutes.");
}
}
}.execute().getResult();
}
}