From bb64769b51c46a7f5d427f593d79730a5908574a Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Thu, 18 Nov 2021 15:55:05 +0100 Subject: [PATCH] integrated Base Maps into GNABaseMaps Runtime Resource --- .settings/org.eclipse.wst.common.component | 30 +++-- .../client/GeoportalDataViewer.java | 15 ++- .../server/GNABaseMapsResourceReader.java | 111 ++++++++++++++++++ .../GeoportalDataViewerServiceImpl.java | 45 ++++--- .../IAMClientCredentialsReader.java | 2 +- .../server/util/SessionUtil.java | 29 +++++ src/main/webapp/GeoportalDataViewer.css | 2 +- src/main/webapp/GeoportalDataViewer.html | 2 +- .../user/geoportaldataviewer/GNABaseMaps.java | 29 +++++ 9 files changed, 229 insertions(+), 36 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GNABaseMapsResourceReader.java create mode 100644 src/test/java/org/gcube/portlets/user/geoportaldataviewer/GNABaseMaps.java diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 72174ae..af45588 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -1,31 +1,41 @@ - + + - + + - + + - + + - + + - + + - + + - + + - + + - + + diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java index bf75a85..b749d7e 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java @@ -42,6 +42,8 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.core.client.ScriptInjector; +import com.google.gwt.dom.client.Style; +import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.shared.HandlerManager; @@ -95,7 +97,7 @@ public class GeoportalDataViewer implements EntryPoint { int attempt = 0; - private LoaderIcon loaderApp = new LoaderIcon("Loading application...."); + //private LoaderIcon loaderApp = new LoaderIcon("Loading application...."); private HTML attributionDiv = new HTML(); @@ -106,7 +108,10 @@ public class GeoportalDataViewer implements EntryPoint { */ public void onModuleLoad() { - loaderApp.getElement().getStyle().setZIndex(100); +// Style style = loaderApp.getElement().getStyle(); +// style.setZIndex(300); +// style.setMarginTop(50,Unit.PX); +// style.setMarginLeft(50, Unit.PX); paramWmsRequest = Window.Location.getParameter(GeoportalDataViewerConstants.GET_WMS_PARAMETER); paramGeonaItemType = Window.Location.getParameter(GeoportalDataViewerConstants.GET_GEONA_ITEM_TYPE); @@ -117,7 +122,7 @@ public class GeoportalDataViewer implements EntryPoint { GWT.log(GeoportalDataViewerConstants.GET_GEONA_ITEM_ID + " = " + paramGeonaItemID); GWT.log(GeoportalDataViewerConstants.GET_LAYER_TITLE + " = " + paramLayerTitle); - RootPanel.get(APP_DIV).add(loaderApp); + //RootPanel.get(APP_DIV).add(loaderApp); mainPanel = new GeonaDataViewMainPanel(applicationBus, getClientHeight()); RootPanel.get(APP_DIV).add(mainPanel); @@ -132,13 +137,13 @@ public class GeoportalDataViewer implements EntryPoint { @Override public void onFailure(Throwable caught) { - RootPanel.get(APP_DIV).remove(loaderApp); + //RootPanel.get(APP_DIV).remove(loaderApp); Window.alert("Error occurred on instancing the GeoPortale Viewer. Please, contact the support"); } @Override public void onSuccess(List listBaseMapLayers) { - RootPanel.get(APP_DIV).remove(loaderApp); + //RootPanel.get(APP_DIV).remove(loaderApp); GeoportalDataViewer.listBaseMapLayers = listBaseMapLayers; //now the map is loaded and I'm sure that I can load the GeonaDataViewer Profile loadGeonaDataViewerProfile(); diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GNABaseMapsResourceReader.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GNABaseMapsResourceReader.java new file mode 100644 index 0000000..20a6291 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GNABaseMapsResourceReader.java @@ -0,0 +1,111 @@ +package org.gcube.portlets.user.geoportaldataviewer.server; + +import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; +import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.gcube.common.encryption.StringEncrypter; +import org.gcube.common.resources.gcore.ServiceEndpoint; +import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer; +import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer.OL_BASE_MAP; +import org.gcube.resources.discovery.client.api.DiscoveryClient; +import org.gcube.resources.discovery.client.queries.api.SimpleQuery; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The Class GNABaseMapsResourceReader. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Nov 18, 2021 + */ +public class GNABaseMapsResourceReader { + + private static Logger LOG = LoggerFactory.getLogger(GNABaseMapsResourceReader.class); + + private static final String SE_PROFILE_NAME = "GNABaseMaps"; + private static final String SE_CATEGORY_NAME = "Application"; + + /** + * Gets the list base maps. + * + * @return the list base maps + * @throws Exception the exception + */ + public static List getListBaseMaps() throws Exception { + + List lstBaseMaps = new ArrayList(); + + LOG.info("Searching SE in the scope: " + ScopeProvider.instance.get() + " with profile name: " + SE_PROFILE_NAME + + " and category name: " + SE_CATEGORY_NAME); + + SimpleQuery query = queryFor(ServiceEndpoint.class); + query.addCondition("$resource/Profile/Name/text() eq '" + SE_PROFILE_NAME + "'"); + query.addCondition("$resource/Profile/Category/text() eq '" + SE_CATEGORY_NAME + "'"); + + DiscoveryClient client = clientFor(ServiceEndpoint.class); + List resources = client.submit(query); + + if (resources.size() > 0) + LOG.info("The query returned " + resources.size() + " ServiceEndpoint/s"); + else + throw new RuntimeException("ServiceEndpoint not found. Searching for profile name: " + SE_PROFILE_NAME + + " and category name: " + SE_CATEGORY_NAME + "in the scope: " + ScopeProvider.instance.get()); + + ServiceEndpoint se = resources.get(0); + Collection theAccessPoints = se.profile().accessPoints().asCollection(); + for (AccessPoint accessPoint : theAccessPoints) { + BaseMapLayer bml = new BaseMapLayer(); + bml.setName(accessPoint.name()); + bml.setAttribution(accessPoint.description()); + String url = accessPoint.address(); + String apiTokenName = accessPoint.username(); + String apiTokenPwd = accessPoint.password(); + LOG.debug("Found API_TOKEN name: " + apiTokenName + ", encrypted token: " + apiTokenPwd); + // decrypting the pwd + try { + if (isValorized(apiTokenPwd)) { + apiTokenPwd = StringEncrypter.getEncrypter().decrypt(apiTokenPwd); + LOG.debug("Token decrypted is: " + apiTokenPwd.substring(0, apiTokenPwd.length() / 2) + + "_MASKED_TOKEN_"); + } + } catch (Exception e) { + throw new RuntimeException("Error on decrypting the pwd: ", e); + } + if (isValorized(apiTokenName) && isValorized(apiTokenPwd)) { + url = String.format("%s?%s=%s", url, apiTokenName, apiTokenPwd); + } + bml.setUrl(url); + + // SETTING MAP TYPE + String urlLower = bml.getUrl().toLowerCase(); + if (urlLower.contains("mapbox")) { + bml.setType(OL_BASE_MAP.MAPBOX); + } else if (urlLower.contains("openstreetmap")) { + bml.setType(OL_BASE_MAP.OSM); + } else + bml.setType(OL_BASE_MAP.OTHER); + + lstBaseMaps.add(bml); + } + + LOG.debug("Read base maps: "+lstBaseMaps); + LOG.info("Returning " + lstBaseMaps.size() + " base maps"); + return lstBaseMaps; + + } + + private static boolean isValorized(String value) { + if (value != null && !value.isEmpty()) { + return true; + } + return false; + } + +} 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 de501bf..b633d94 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 @@ -322,8 +322,7 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme if (layerPosizionamento != null) { if (!GeoNACheckAccessPolicy.isAccessible(layerPosizionamento.getPolicy(), userName)) { concessionDV.setPosizionamentoScavo(null); - } else { - LOG.info("Posizionamento di Scavo is not accessible by current user"); + LOG.info("Posizionamento di Scavo is not accessible by current user: "+userName); } } @@ -333,6 +332,8 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme 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); @@ -342,6 +343,7 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme if (abstractRS != null) { if (!GeoNACheckAccessPolicy.isAccessible(abstractRS.getPolicy(), userName)) { concessionDV.setAbstractRelazioneScavo(null); + LOG.info("Abstract relazione is not accessible by current user: "+userName); } } @@ -349,6 +351,7 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme if (relazioneScavo != null) { if (!GeoNACheckAccessPolicy.isAccessible(relazioneScavo.getPolicy(), userName)) { concessionDV.setRelazioneScavo(null); + LOG.info("Relazione scavo is not accessible by current user: "+userName); } } @@ -361,6 +364,8 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme if (GeoNACheckAccessPolicy.isAccessible(uploadedImageDV.getPolicy(), userName)) { accessibleListImages.add(uploadedImageDV); + }else { + LOG.info("Immagine "+uploadedImageDV.getTitolo()+" is not accessible by current user: "+userName); } } @@ -664,24 +669,28 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme @Override public List getListBaseLayers() { - + LOG.info("getListBaseLayers called"); List listBL = new ArrayList(); - - // OSM - String attribution = "© OpenStreetMap"; - BaseMapLayer baseLayer = new BaseMapLayer("Open Street Map", "https://tile.openstreetmap.org/{z}/{x}/{y}.png", attribution, - BaseMapLayer.OL_BASE_MAP.OSM); - - listBL.add(baseLayer); + //Setting scope in the cuurent thread + SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true); + listBL = SessionUtil.getGNABaseMaps(this.getThreadLocalRequest()); - - // MAPBOX - attribution = "© Mapbox © OpenStreetMap Improve this map"; - baseLayer = new BaseMapLayer("MapBox Satellite", - "https://{a-d}.tiles.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoiZDRzY2llbmNlIiwiYSI6ImNpcW1nZjE4MDAwMXNod25rdHJsemRoNTQifQ.YPNkNLb8EzjThpvJl1tg4w", - attribution, BaseMapLayer.OL_BASE_MAP.MAPBOX); - - listBL.add(baseLayer); + LOG.info("getListBaseLayers returning "+listBL.size() +" base maps"); +// +// String attribution; +// BaseMapLayer baseLayer; +// // OSM +// attribution = "© OpenStreetMap"; +// baseLayer = new BaseMapLayer("Open Street Map", "https://tile.openstreetmap.org/{z}/{x}/{y}.png", attribution, +// BaseMapLayer.OL_BASE_MAP.OSM); +// listBL.add(baseLayer); +// // MAPBOX +// attribution = "© Mapbox © OpenStreetMap Improve this map"; +// baseLayer = new BaseMapLayer("MapBox Satellite", +// "https://{a-d}.tiles.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoiZDRzY2llbmNlIiwiYSI6ImNpcW1nZjE4MDAwMXNod25rdHJsemRoNTQifQ.YPNkNLb8EzjThpvJl1tg4w", +// attribution, BaseMapLayer.OL_BASE_MAP.MAPBOX); +// +// listBL.add(baseLayer); return listBL; diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/mongoservice/IAMClientCredentialsReader.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/mongoservice/IAMClientCredentialsReader.java index 6df98b6..3b10b94 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/mongoservice/IAMClientCredentialsReader.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/mongoservice/IAMClientCredentialsReader.java @@ -17,7 +17,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * The Class IAMClientCredentialsReader. + * The Class GNABaseMapsResourceReader. * * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it * 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 b99787c..301178d 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,12 +3,16 @@ */ package org.gcube.portlets.user.geoportaldataviewer.server.util; +import java.util.List; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; 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.shared.gis.BaseMapLayer; import org.gcube.portlets.user.urlshortener.UrlShortener; import org.gcube.vomanagement.usermanagement.GroupManager; import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; @@ -34,6 +38,7 @@ public class SessionUtil { private static Logger LOG = LoggerFactory.getLogger(SessionUtil.class); private static final String URL_SHORTENER_SERVICE = "URL_SHORTENER_SERVICE"; + private static final String LIST_BASE_MAPS_LAYERS = "LIST_BASE_MAPS_LAYERS"; /** * Checks if is into portal. @@ -168,4 +173,28 @@ public class SessionUtil { return shortener; } + + /** + * Gets the GNA base maps. + * + * @param httpServletRequest the http servlet request + * @return the GNA base maps + */ + public static List getGNABaseMaps(HttpServletRequest httpServletRequest) { + HttpSession session = httpServletRequest.getSession(); + List lstBML = null; + try { + lstBML = (List) session.getAttribute(LIST_BASE_MAPS_LAYERS); + + if (lstBML == null) { + GNABaseMapsResourceReader gnaBMRR = new GNABaseMapsResourceReader(); + lstBML = gnaBMRR.getListBaseMaps(); + session.setAttribute(LIST_BASE_MAPS_LAYERS, lstBML); + } + + } catch (Exception e) { + LOG.warn("Error occurred reading the base maps by " + GNABaseMapsResourceReader.class.getSimpleName(), e); + } + return lstBML; + } } diff --git a/src/main/webapp/GeoportalDataViewer.css b/src/main/webapp/GeoportalDataViewer.css index 09f8556..e2ad823 100644 --- a/src/main/webapp/GeoportalDataViewer.css +++ b/src/main/webapp/GeoportalDataViewer.css @@ -434,7 +434,7 @@ body { .base-internal-layers-maplink .btn-link { /*border: 1px solid #eee;*/ - border: 1px solid #005580; + border: 2px solid rgba(255,255,255,.4); /*background-color: #fcfcfc;*/ margin: 1px; } diff --git a/src/main/webapp/GeoportalDataViewer.html b/src/main/webapp/GeoportalDataViewer.html index 6050d5f..72a7ebd 100644 --- a/src/main/webapp/GeoportalDataViewer.html +++ b/src/main/webapp/GeoportalDataViewer.html @@ -31,7 +31,7 @@ -Web Application Starter Project +GNA Data Viewer Application diff --git a/src/test/java/org/gcube/portlets/user/geoportaldataviewer/GNABaseMaps.java b/src/test/java/org/gcube/portlets/user/geoportaldataviewer/GNABaseMaps.java new file mode 100644 index 0000000..b1bd0cf --- /dev/null +++ b/src/test/java/org/gcube/portlets/user/geoportaldataviewer/GNABaseMaps.java @@ -0,0 +1,29 @@ +package org.gcube.portlets.user.geoportaldataviewer; + +import java.util.List; + +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.portlets.user.geoportaldataviewer.server.GNABaseMapsResourceReader; +import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer; +import org.junit.Test; + +public class GNABaseMaps { + + private static final String SCOPE = "/gcube/devsec/devVRE"; + + @Test + public void readBaseMaps() { + System.out.println("called readBaseMaps test"); + ScopeProvider.instance.set(SCOPE); + GNABaseMapsResourceReader gnaBaseMapsR = new GNABaseMapsResourceReader(); + List lstBML = null; + try { + lstBML = gnaBaseMapsR.getListBaseMaps(); + } catch (Exception e) { + e.printStackTrace(); + } + + System.out.println("Read base map layers: " + lstBML); + } + +}