diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/SectionViewer.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/SectionViewer.java index 5be0a0d..6cb6524 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/SectionViewer.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/SectionViewer.java @@ -6,7 +6,6 @@ import org.gcube.application.geoportalcommon.shared.geoportal.view.FilesetDV; import org.gcube.application.geoportalcommon.shared.geoportal.view.PayloadDV; import org.gcube.application.geoportalcommon.shared.geoportal.view.SectionView; import org.gcube.application.geoportalcommon.shared.geoportal.view.SubDocumentView; -import org.gcube.application.geoportalcommon.shared.products.content.WorkspaceContentDV; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants; import org.gcube.portlets.user.geoportaldataviewer.client.ui.cms.gallery.ImagesSectionGallery; import org.gcube.portlets.user.geoportaldataviewer.client.ui.util.CustomFlexTable; diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GcubeProfilesPerUCDIdCache.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GcubeProfilesPerUCDIdCache.java new file mode 100644 index 0000000..efa6c75 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GcubeProfilesPerUCDIdCache.java @@ -0,0 +1,163 @@ +/** + * + */ + +package org.gcube.portlets.user.geoportaldataviewer.server; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import org.gcube.application.geoportal.common.model.useCaseDescriptor.HandlerDeclaration; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; +import org.gcube.application.geoportalcommon.ConvertToDataValueObjectModel; +import org.gcube.application.geoportalcommon.geoportal.GeoportalClientCaller; +import org.gcube.application.geoportalcommon.geoportal.UseCaseDescriptorCaller; +import org.gcube.application.geoportalcommon.shared.geoportal.ConfigurationDV; +import org.gcube.application.geoportalcommon.shared.geoportal.config.GcubeProfileDV; +import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_CONFIGURATION_TYPE; +import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_DATA_HANDLER; +import org.gcube.application.geoportalcommon.shared.geoportal.ucd.HandlerDeclarationDV; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.portlets.widgets.mpformbuilder.server.MetadataProfileFormBuilderServiceImpl; +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.cache.RemovalListener; +import com.google.common.cache.RemovalNotification; + +/** + * The Class GcubeProfilesPerUCDIdCache. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Oct 12, 2022 + */ +public class GcubeProfilesPerUCDIdCache { + + private static Logger LOG = LoggerFactory.getLogger(GcubeProfilesPerUCDIdCache.class); + + private static LoadingCache>> gCubeProfilesPerProfileIDCache; + + static { + + CacheLoader>> loader = new CacheLoader>>() { + @Override + public LinkedHashMap> load(String scope) throws Exception { + LOG.info("Loading the cache for scope: " + scope); + return loadGcubeProfilesForUCDIdInTheScope(scope); + } + }; + + RemovalListener>> removalListener = new RemovalListener>>() { + public void onRemoval( + RemovalNotification>> removal) { + LOG.debug("cache expired"); + } + }; + + gCubeProfilesPerProfileIDCache = CacheBuilder.newBuilder().maximumSize(1000) + .expireAfterWrite(15, TimeUnit.MINUTES).removalListener(removalListener).build(loader); + + LOG.info("cache instancied"); + } + + /** + * Gets the. + * + * @param scope the scope + * @return the geonetwork instance + * @throws Exception + */ + public static LinkedHashMap> get(String scope) throws Exception { + LOG.info("GcubeProfilesPerUCDIdCache get - called in the scope: " + scope); + LinkedHashMap> map = gCubeProfilesPerProfileIDCache.get(scope); + LOG.info("GcubeProfilesPerUCDIdCache returning map null? " + (map==null)); + return map; + } + + /** + * Load geonetwork instance. + * + * @param scope the scope + * @return the linked hash map + * @throws Exception the exception + */ + private static LinkedHashMap> loadGcubeProfilesForUCDIdInTheScope( + String scope) throws Exception { + LOG.info("loadGcubeProfilesForUCDIdInTheScope called in the scope: " + scope); + + LinkedHashMap> linkedMap_UCDId_gCubeProfiles = new LinkedHashMap>(); + try { + ScopeProvider.instance.set(scope); + UseCaseDescriptorCaller clientUCD = GeoportalClientCaller.useCaseDescriptors(); + List listUCDs = clientUCD.getList(); + LOG.debug("listUCDs: " + listUCDs); + + for (UseCaseDescriptor ucd : listUCDs) { + + LOG.info("Loaded UCD for ID: " + ucd.getId()); + String profileID = ucd.getId(); + GEOPORTAL_DATA_HANDLER theHandler = GEOPORTAL_DATA_HANDLER.geoportal_data_entry; + List handlers = ucd.getHandlersByType(theHandler.getType()); + + if (handlers.size() == 0) { + LOG.warn("No handler " + theHandler + "found into UCD " + ucd.getId() + ", continue..."); + continue; + } + + // Loading Handler gcube_profiles + HandlerDeclaration dataEntryHandler = handlers.get(0); + HandlerDeclarationDV handlerGcubeProfiles = ConvertToDataValueObjectModel + .toHandlerDeclarationDV(dataEntryHandler, ucd, GEOPORTAL_CONFIGURATION_TYPE.gcube_profiles); + + LOG.debug("Handler " + GEOPORTAL_CONFIGURATION_TYPE.gcube_profiles + " for PROFILE_ID: " + ucd.getId()); + LOG.debug("" + handlerGcubeProfiles); + + ConfigurationDV config = handlerGcubeProfiles.getConfiguration(); + // List of gCube Profiles defined in the UCD + List listGcubeProfiles = (List) config.getConfiguration(); + LOG.debug("List of GcubeProfileDV are: " + listGcubeProfiles); + + List listProfilesBean = new ArrayList(); + // Loading Metadata Profile from IS + MetadataProfileFormBuilderServiceImpl metaProfileBUilder = new MetadataProfileFormBuilderServiceImpl(); + + for (GcubeProfileDV gcubeProfileDV : listGcubeProfiles) { + ScopeProvider.instance.set(scope); + GcubeProfilesMetadataForUCD gCubeProfileMetadataForUCD = new GcubeProfilesMetadataForUCD(); + List listProfiles = metaProfileBUilder.getProfilesInTheScopeForName(scope, + gcubeProfileDV.getGcubeSecondaryType(), gcubeProfileDV.getGcubeName()); + + String key = gcubeProfileDV.getGcubeSecondaryType() + gcubeProfileDV.getGcubeName(); + LOG.debug("for key: " + key + " readi profiles: " + listGcubeProfiles); + gCubeProfileMetadataForUCD.setGcubeProfile(gcubeProfileDV); + gCubeProfileMetadataForUCD.setListMetadataProfileBean(listProfiles); + listProfilesBean.add(gCubeProfileMetadataForUCD); + + } + linkedMap_UCDId_gCubeProfiles.put(ucd.getId(), listProfilesBean); + + if (LOG.isDebugEnabled()) { + for (String key : linkedMap_UCDId_gCubeProfiles.keySet()) { + LOG.debug("For key '" + key + "' got profiles: " + linkedMap_UCDId_gCubeProfiles.get(key)); + } + } + + } + + } catch (Exception e) { + String erroMsg = "Error occurred on preloadgCubeProfilesForUCDs: "; + LOG.error(erroMsg, e); + } + + LOG.info("GcubeProfilesPerUCDIdCache loaded with " + linkedMap_UCDId_gCubeProfiles.size() + " item/s"); + return linkedMap_UCDId_gCubeProfiles; + } +} diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerHttpSessionListener.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerHttpSessionListener.java index de8f29e..b06f745 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerHttpSessionListener.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerHttpSessionListener.java @@ -20,7 +20,5 @@ public class GeoportalDataViewerHttpSessionListener implements HttpSessionListen @Override public void sessionCreated(HttpSessionEvent arg0) { LOG.info("sessionCreated called. Session id is: "+arg0.getSession().getId()); - - new GeoportalDataViewerServiceImpl().preloadgCubeProfilesForUCDs(); } } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerServiceImpl.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerServiceImpl.java index 15fb98f..db0e2a5 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerServiceImpl.java @@ -6,18 +6,17 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.bson.Document; import org.gcube.application.geoportal.client.utils.Serialization; -import org.gcube.application.geoportal.common.model.useCaseDescriptor.HandlerDeclaration; -import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; import org.gcube.application.geoportalcommon.ConvertToDataValueObjectModel; import org.gcube.application.geoportalcommon.GeoportalCommon; -import org.gcube.application.geoportalcommon.geoportal.GeoportalClientCaller; -import org.gcube.application.geoportalcommon.geoportal.UseCaseDescriptorCaller; import org.gcube.application.geoportalcommon.geoportal.access.GeportalCheckAccessPolicy; import org.gcube.application.geoportalcommon.geoportal.serdes.Payload; import org.gcube.application.geoportalcommon.shared.GNADataViewerConfigProfile; @@ -25,14 +24,11 @@ import org.gcube.application.geoportalcommon.shared.GeoNaItemRef; import org.gcube.application.geoportalcommon.shared.LayerItem; import org.gcube.application.geoportalcommon.shared.ResultSetPaginatedData; import org.gcube.application.geoportalcommon.shared.SearchingFilter; -import org.gcube.application.geoportalcommon.shared.geoportal.ConfigurationDV; import org.gcube.application.geoportalcommon.shared.geoportal.config.FilePathDV; import org.gcube.application.geoportalcommon.shared.geoportal.config.GcubeProfileDV; import org.gcube.application.geoportalcommon.shared.geoportal.config.ItemFieldDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_CONFIGURATION_TYPE; -import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_DATA_HANDLER; -import org.gcube.application.geoportalcommon.shared.geoportal.ucd.HandlerDeclarationDV; import org.gcube.application.geoportalcommon.shared.geoportal.view.FilesetDV; import org.gcube.application.geoportalcommon.shared.geoportal.view.PayloadDV; import org.gcube.application.geoportalcommon.shared.geoportal.view.ProjectView; @@ -56,7 +52,6 @@ import org.gcube.portlets.user.geoportaldataviewer.shared.gis.wms.GeoInformation 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.portlets.widgets.mpformbuilder.server.MetadataProfileFormBuilderServiceImpl; import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean; import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper; import org.gcube.spatial.data.geoutility.GeoNcWMSMetadataUtility; @@ -68,6 +63,7 @@ import org.json.JSONArray; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.cache.CacheLoader.InvalidCacheLoadException; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; @@ -87,13 +83,13 @@ import com.jayway.jsonpath.spi.json.JsonOrgJsonProvider; 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"; public static final String JSON_$_POINTER = "$"; - + public static enum COMMON_IMAGES_FORMAT { gif, png, jpeg, jpg, bmp, tif, tiff, svg, avif, webp } @@ -275,8 +271,6 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme return getUploadedImagesForId(this.getThreadLocalRequest(), itemType, itemId, maxImages); } - - /** * Gets the concessione for id. * @@ -290,109 +284,92 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme throw new Exception("getConcessioneForId must be removed!"); /* - 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); - - GeoportalServiceIdentityProxy cms = new GeoportalServiceIdentityProxy(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 listLayersDV = concessionDV.getPianteFineScavo(); - if (listLayersDV != null) { - List accessibleListLayersDV = new ArrayList(); - 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 immagini = concessionDV.getImmaginiRappresentative(); - if (immagini != null && immagini.size() > 0) { - List accessibleListImages = new ArrayList(); - - // 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); - } + * 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); + * + * GeoportalServiceIdentityProxy cms = new + * GeoportalServiceIdentityProxy(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 listLayersDV = concessionDV.getPianteFineScavo(); if + * (listLayersDV != null) { List accessibleListLayersDV = + * new ArrayList(); 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 immagini = concessionDV.getImmaginiRappresentative(); + * if (immagini != null && immagini.size() > 0) { List + * accessibleListImages = new ArrayList(); + * + * // 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); } */ } @@ -628,47 +605,41 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme LOG.info("getUploadedImagesForId [itemId: " + itemId + ", itemType: " + itemType + "] called"); throw new Exception("getUploadedImagesForId must be revisited"); - - /*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 listUI = null; - - try { - - if (itemType.equalsIgnoreCase("concessione")) { - - LOG.info("Trying to get concessione for id " + itemId); - GeoportalServiceIdentityProxy cms = new GeoportalServiceIdentityProxy(httpServletRequest); - Concessione concessione = cms.getItemById(itemId); - if (concessione != null) { - LOG.info("For id " + itemId + ", got concessione " + concessione.getNome() + " from service"); - List images = concessione.getImmaginiRappresentative(); - - if (images != null) { - listUI = new ArrayList(); - 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); - }*/ + /* + * 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 listUI = null; + * + * try { + * + * if (itemType.equalsIgnoreCase("concessione")) { + * + * LOG.info("Trying to get concessione for id " + itemId); + * GeoportalServiceIdentityProxy cms = new + * GeoportalServiceIdentityProxy(httpServletRequest); Concessione concessione = + * cms.getItemById(itemId); if (concessione != null) { LOG.info("For id " + + * itemId + ", got concessione " + concessione.getNome() + " from service"); + * List images = concessione.getImmaginiRappresentative(); + * + * if (images != null) { listUI = new ArrayList(); 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); } + */ } @@ -705,7 +676,7 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme return profile.getListItemFields(); } - + /** * * @@ -738,11 +709,30 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme */ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + LOG.info("init called"); + //Init one GcubeProfilesPerUCDIdCache for the application + new GcubeProfilesPerUCDIdCache(); + } + + @Override + protected void onBeforeRequestDeserialized(String serializedRequest) { + LOG.info("onBeforeRequestDeserialized called"); + String scope = ""; + try { + new GeoportalServiceIdentityProxy(this.getThreadLocalRequest()); + scope = SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true); + //Loading GcubeProfilesPerUCDIdCache per scope + GcubeProfilesPerUCDIdCache.get(scope); + } catch (Exception e) { + LOG.error("Error on loading the " + GcubeProfilesPerUCDIdCache.class.getSimpleName() + " for scope: "+scope, e); + e.printStackTrace(); + } + super.onBeforeRequestDeserialized(serializedRequest); + } - - - - /** * Gets the list concessioni. * @@ -783,81 +773,79 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme } - /** - * Preloadg cube profiles for UC ds. - */ - public void preloadgCubeProfilesForUCDs() { - LOG.info("preloadgCubeProfilesForUCDs called"); - try { - - String currentContext = SessionUtil.getCurrentContext(getThreadLocalRequest(), true); - LOG.info("preloadgCubeProfilesForUCDs context: "+currentContext); - UseCaseDescriptorCaller clientUCD = GeoportalClientCaller.useCaseDescriptors(); - SessionUtil.getCurrentContext(getThreadLocalRequest(), true); - List listUCDs = clientUCD.getList(); - LOG.debug("listUCDs: "+listUCDs); - - for (UseCaseDescriptor ucd : listUCDs) { +// /** +// * Preloadg cube profiles for UC ds. +// */ +// public void preloadgCubeProfilesForUCDs() { +// LOG.info("preloadgCubeProfilesForUCDs called"); +// try { +// +// String currentContext = SessionUtil.getCurrentContext(getThreadLocalRequest(), true); +// LOG.info("preloadgCubeProfilesForUCDs context: " + currentContext); +// UseCaseDescriptorCaller clientUCD = GeoportalClientCaller.useCaseDescriptors(); +// SessionUtil.getCurrentContext(getThreadLocalRequest(), true); +// List listUCDs = clientUCD.getList(); +// LOG.debug("listUCDs: " + listUCDs); +// +// for (UseCaseDescriptor ucd : listUCDs) { +// +// LOG.info("Loaded UCD for ID: " + ucd.getId()); +// String profileID = ucd.getId(); +// GEOPORTAL_DATA_HANDLER theHandler = GEOPORTAL_DATA_HANDLER.geoportal_data_entry; +// List handlers = ucd.getHandlersByType(theHandler.getType()); +// +// if (handlers.size() == 0) { +// LOG.warn("No handler " + theHandler + "found into UCD " + ucd.getId() + ", continue..."); +// continue; +// } +// +// // Loading Handler gcube_profiles +// HandlerDeclaration dataEntryHandler = handlers.get(0); +// HandlerDeclarationDV handlerGcubeProfiles = ConvertToDataValueObjectModel +// .toHandlerDeclarationDV(dataEntryHandler, ucd, GEOPORTAL_CONFIGURATION_TYPE.gcube_profiles); +// +// LOG.debug("Handler " + GEOPORTAL_CONFIGURATION_TYPE.gcube_profiles + " for PROFILE_ID: " + ucd.getId()); +// LOG.debug("" + handlerGcubeProfiles); +// +// ConfigurationDV config = handlerGcubeProfiles.getConfiguration(); +// // List of gCube Profiles defined in the UCD +// List listGcubeProfiles = (List) config.getConfiguration(); +// LOG.debug("List of GcubeProfileDV are: " + listGcubeProfiles); +// +// List listProfilesBean = new ArrayList(); +// // Loading Metadata Profile from IS +// MetadataProfileFormBuilderServiceImpl metaProfileBUilder = new MetadataProfileFormBuilderServiceImpl(); +// +// LinkedHashMap> linkedMap_UCDId_gCubeProfiles = new LinkedHashMap>(); +// for (GcubeProfileDV gcubeProfileDV : listGcubeProfiles) { +// String context = SessionUtil.getCurrentContext(getThreadLocalRequest(), true); +// GcubeProfilesMetadataForUCD gCubeProfileMetadataForUCD = new GcubeProfilesMetadataForUCD(); +// List listProfiles = metaProfileBUilder.getProfilesInTheScopeForName(context, +// gcubeProfileDV.getGcubeSecondaryType(), gcubeProfileDV.getGcubeName()); +// +// String key = gcubeProfileDV.getGcubeSecondaryType() + gcubeProfileDV.getGcubeName(); +// LOG.debug("for key: " + key + " readi profiles: " + listGcubeProfiles); +// gCubeProfileMetadataForUCD.setGcubeProfile(gcubeProfileDV); +// gCubeProfileMetadataForUCD.setListMetadataProfileBean(listProfiles); +// listProfilesBean.add(gCubeProfileMetadataForUCD); +// +// } +// linkedMap_UCDId_gCubeProfiles.put(ucd.getId(), listProfilesBean); +// +// for (String key : linkedMap_UCDId_gCubeProfiles.keySet()) { +// LOG.debug("For key '" + key + "' got profiles: " + linkedMap_UCDId_gCubeProfiles.get(key)); +// } +// +// SessionUtil.setMap_UCDId_gCubeProfiles(getThreadLocalRequest(), profileID, +// linkedMap_UCDId_gCubeProfiles); +// } +// +// } catch (Exception e) { +// String erroMsg = "Error occurred on preloadgCubeProfilesForUCDs: "; +// LOG.error(erroMsg, e); +// } +// } - LOG.info("Loaded UCD for ID: " + ucd.getId()); - String profileID = ucd.getId(); - GEOPORTAL_DATA_HANDLER theHandler = GEOPORTAL_DATA_HANDLER.geoportal_data_entry; - List handlers = ucd.getHandlersByType(theHandler.getType()); - - if (handlers.size() == 0) { - LOG.warn("No handler " + theHandler + "found into UCD " + ucd.getId() + ", continue..."); - continue; - } - - // Loading Handler gcube_profiles - HandlerDeclaration dataEntryHandler = handlers.get(0); - HandlerDeclarationDV handlerGcubeProfiles = ConvertToDataValueObjectModel - .toHandlerDeclarationDV(dataEntryHandler, ucd, GEOPORTAL_CONFIGURATION_TYPE.gcube_profiles); - - LOG.debug("Handler " + GEOPORTAL_CONFIGURATION_TYPE.gcube_profiles + " for PROFILE_ID: " + ucd.getId()); - LOG.debug("" + handlerGcubeProfiles); - - ConfigurationDV config = handlerGcubeProfiles.getConfiguration(); - // List of gCube Profiles defined in the UCD - List listGcubeProfiles = (List) config.getConfiguration(); - LOG.debug("List of GcubeProfileDV are: " + listGcubeProfiles); - - List listProfilesBean = new ArrayList(); - // Loading Metadata Profile from IS - MetadataProfileFormBuilderServiceImpl metaProfileBUilder = new MetadataProfileFormBuilderServiceImpl(); - - LinkedHashMap> linkedMap_UCDId_gCubeProfiles = new LinkedHashMap>(); - for (GcubeProfileDV gcubeProfileDV : listGcubeProfiles) { - String context = SessionUtil.getCurrentContext(getThreadLocalRequest(), true); - GcubeProfilesMetadataForUCD gCubeProfileMetadataForUCD = new GcubeProfilesMetadataForUCD(); - List listProfiles = metaProfileBUilder.getProfilesInTheScopeForName(context, - gcubeProfileDV.getGcubeSecondaryType(), gcubeProfileDV.getGcubeName()); - - String key = gcubeProfileDV.getGcubeSecondaryType() + gcubeProfileDV.getGcubeName(); - LOG.debug("for key: " + key + " readi profiles: " + listGcubeProfiles); - gCubeProfileMetadataForUCD.setGcubeProfile(gcubeProfileDV); - gCubeProfileMetadataForUCD.setListMetadataProfileBean(listProfiles); - listProfilesBean.add(gCubeProfileMetadataForUCD); - - } - linkedMap_UCDId_gCubeProfiles.put(ucd.getId(), listProfilesBean); - - for (String key : linkedMap_UCDId_gCubeProfiles.keySet()) { - LOG.debug("For key '" + key + "' got profiles: " + linkedMap_UCDId_gCubeProfiles.get(key)); - } - - SessionUtil.setMap_UCDId_gCubeProfiles(getThreadLocalRequest(), profileID, - linkedMap_UCDId_gCubeProfiles); - } - - } catch (Exception e) { - String erroMsg = "Error occurred on preloadgCubeProfilesForUCDs: "; - LOG.error(erroMsg, e); - } - } - - - /** * Gets the layers for id. * @@ -951,7 +939,7 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme try { - SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true); + String scope = SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true); String userName = null; try { userName = SessionUtil.getCurrentUser(this.getThreadLocalRequest()).getUsername(); @@ -972,14 +960,7 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme ProjectView projectView = new ProjectView(); projectView.setTheProjectDV(theProjectDV); - LinkedHashMap> linkedMap_UCDId_gCubeProfiles = SessionUtil - .getMap_UCDId_gCubeProfiles(getThreadLocalRequest(), profileID); - - if(linkedMap_UCDId_gCubeProfiles==null) { - preloadgCubeProfilesForUCDs(); - linkedMap_UCDId_gCubeProfiles = SessionUtil - .getMap_UCDId_gCubeProfiles(getThreadLocalRequest(), profileID); - } + LinkedHashMap> linkedMap_UCDId_gCubeProfiles = GcubeProfilesPerUCDIdCache.get(scope); // NO UCD defined, applyong default if (linkedMap_UCDId_gCubeProfiles.size() == 0) { @@ -988,9 +969,44 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme SectionView sectionView = new SectionView(); sectionView.setSectionTitle("Document"); SubDocumentView subDocumentView = new SubDocumentView(); - subDocumentView.setMetadataAsJSON(theProjectDV.getTheDocument().getDocumentAsJSON()); - sectionView.addSubDocument(subDocumentView); - projectView.addSectionView(sectionView); + + Document sectionDoc = Document.parse(theProjectDV.getTheDocument().getDocumentAsJSON()); + boolean isAccessibleSection = isAccessibleSectionAccordingToPolicy(sectionDoc, JSON_$_POINTER, + userName); + + // If is accessible + if (isAccessibleSection) { + + // Creating one Project with one SectionView and SubDocumentView + String wholeSectionDoc = sectionDoc.toJson(); + subDocumentView.setMetadataAsJSON(wholeSectionDoc); + + List listFiles = new ArrayList(); + List listImages = new ArrayList(); + String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, "fileset"); + List listPayloads = readPayloadsForFileset(filesetJSONPath, wholeSectionDoc); + FilesetDV filesetDV = new FilesetDV(); + filesetDV.setName("fileset"); + for (Payload payload : listPayloads) { + PayloadDV payloadDV = ConvertToDataValueObjectModel.toPayloadDV(payload); + filesetDV.addPayloadDV(payloadDV); + boolean isImage = ImageDetector.isImage(payload.getMimetype()); + + if (isImage) { + listImages.add(filesetDV); + } else { + listFiles.add(filesetDV); + } + } + + // TODO LAYERS + subDocumentView.setListImages(listImages); + subDocumentView.setListFiles(listFiles); + sectionView.addSubDocument(subDocumentView); + projectView.addSectionView(sectionView); + + } + } List listProfilesBean = linkedMap_UCDId_gCubeProfiles.get(profileID); diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/util/SessionUtil.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/util/SessionUtil.java index f14cfb8..a25c6db 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/util/SessionUtil.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/util/SessionUtil.java @@ -3,7 +3,6 @@ */ package org.gcube.portlets.user.geoportaldataviewer.server.util; -import java.util.LinkedHashMap; import java.util.List; import javax.servlet.http.HttpServletRequest; @@ -15,7 +14,6 @@ import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.portal.PortalContext; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.portlets.user.geoportaldataviewer.server.GNABaseMapsResourceReader; -import org.gcube.portlets.user.geoportaldataviewer.server.GcubeProfilesMetadataForUCD; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer; import org.gcube.portlets.user.urlshortener.UrlShortener; import org.gcube.vomanagement.usermanagement.GroupManager; @@ -182,24 +180,6 @@ public class SessionUtil { return shortener; } - - public static LinkedHashMap> getMap_UCDId_gCubeProfiles( - HttpServletRequest httpServletRequest, String profileID) { - - HttpSession session = httpServletRequest.getSession(); - return (LinkedHashMap>) session - .getAttribute(MAP_UCD_ID_TO_GCUBE_PROFILES +"_"+profileID); - - } - - public static void setMap_UCDId_gCubeProfiles(HttpServletRequest httpServletRequest, - String profileID, LinkedHashMap> map) { - - HttpSession session = httpServletRequest.getSession(); - session.setAttribute(MAP_UCD_ID_TO_GCUBE_PROFILES +"_"+profileID, map); - - } - /** * Gets the GNA base maps. *