package org.gcube.portlets.user.geoportaldataviewer.client; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; import org.gcube.application.geoportalcommon.shared.GNADataViewerConfigProfile; import org.gcube.application.geoportalcommon.shared.GeoportalItemReferences; import org.gcube.application.geoportalcommon.shared.geoportal.DocumentDV; import org.gcube.application.geoportalcommon.shared.geoportal.materialization.IndexLayerDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV; import org.gcube.application.geoportalcommon.shared.geoportal.view.ProjectView; import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV; import org.gcube.application.geoportalcommon.shared.products.model.RecordDV; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MAP_PROJECTION; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MapEventType; import org.gcube.portlets.user.geoportaldataviewer.client.events.AddedLayerToMapEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.AddedLayerToMapEvent.LAYER_TYPE; import org.gcube.portlets.user.geoportaldataviewer.client.events.AddedLayerToMapEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.ChangeMapLayerEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.ChangeMapLayerEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.ClosedViewDetailsEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.ClosedViewDetailsEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.DoActionOnDetailLayersEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.DoActionOnDetailLayersEvent.DO_LAYER_ACTION; import org.gcube.portlets.user.geoportaldataviewer.client.events.DoActionOnDetailLayersEvent.SwapLayer; import org.gcube.portlets.user.geoportaldataviewer.client.events.DoActionOnDetailLayersEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.MapExtentToEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.MapExtentToEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.QueryDataEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.SearchPerformedEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.SearchPerformedEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowDetailsEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowDetailsEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowPopupOnCentroiEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowPopupOnCentroiEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.ZoomOutOverMinimumEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.ZoomOutOverMinimumEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.CloseCollectionEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.CloseCollectionEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.OpenCollectionEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.OpenCollectionEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.gis.ExtentWrapped; import org.gcube.portlets.user.geoportaldataviewer.client.gis.MapUtils; import org.gcube.portlets.user.geoportaldataviewer.client.gis.OpenLayerMap; import org.gcube.portlets.user.geoportaldataviewer.client.ui.GeonaDataViewMainPanel; import org.gcube.portlets.user.geoportaldataviewer.client.util.ControlledCallBack; import org.gcube.portlets.user.geoportaldataviewer.client.util.LoaderIcon; import org.gcube.portlets.user.geoportaldataviewer.shared.GCubeCollection; import org.gcube.portlets.user.geoportaldataviewer.shared.ItemFieldsResponse; import org.gcube.portlets.user.geoportaldataviewer.shared.ViewerConfiguration; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.BaseMapLayer; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.GeoQuery; import com.google.gwt.core.client.EntryPoint; 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.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.RootPanel; import ol.Coordinate; import ol.layer.Image; /** * Entry point classes define onModuleLoad(). * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * * Oct 27, 2020 */ public class GeoportalDataViewer implements EntryPoint { /** The Constant APP_DIV. */ public final static String APP_DIV = "geoportal-data-viewer"; /** The ol map. */ // private OpenLayerMap olMap = null; /** The main panel. */ private GeonaDataViewMainPanel mainPanel; /** The param wms request. */ private String paramWmsRequest; /** The param UUID. */ // private String paramUUID; private String paramGeonaItemType; /** The param layer title. */ private String paramLayerTitle; private HandlerManager applicationBus = new HandlerManager(""); /** The layer manager. */ private LayerManager layerManager = new LayerManager(applicationBus); private String paramGeonaItemID; private GNADataViewerConfigProfile geonaDataViewerProfile; private OLMapManager olMapMng = null; int attempt = 0; private LoaderIcon loaderApp = new LoaderIcon("Loading application... please wait"); private HTML attributionDiv = new HTML(); private static List listBaseMapLayers = null; private static ViewerStatus viewerStatus = new ViewerStatus(); /** * This is the entry point method. */ public void onModuleLoad() { loaderApp.getElement().addClassName("loader-gna-app"); RootPanel.get(APP_DIV).add(loaderApp); paramWmsRequest = Window.Location.getParameter(GeoportalDataViewerConstants.GET_WMS_PARAMETER); paramGeonaItemType = Window.Location.getParameter(GeoportalDataViewerConstants.GET_GEONA_ITEM_TYPE); paramGeonaItemID = Window.Location.getParameter(GeoportalDataViewerConstants.GET_GEONA_ITEM_ID); paramLayerTitle = Window.Location.getParameter(GeoportalDataViewerConstants.GET_LAYER_TITLE); GWT.log(GeoportalDataViewerConstants.GET_WMS_PARAMETER + " = " + paramWmsRequest); GWT.log(GeoportalDataViewerConstants.GET_GEONA_ITEM_TYPE + " = " + paramGeonaItemType); GWT.log(GeoportalDataViewerConstants.GET_GEONA_ITEM_ID + " = " + paramGeonaItemID); GWT.log(GeoportalDataViewerConstants.GET_LAYER_TITLE + " = " + paramLayerTitle); RootPanel.get(APP_DIV).add(loaderApp); GeoportalDataViewerServiceAsync.Util.getInstance() .listOfFieldsForSearching(new AsyncCallback>() { @Override public void onFailure(Throwable caught) { // TODO Auto-generated method stub } @Override public void onSuccess(List itemFieldsResult) { GWT.log("listOfFieldsForSearching: " + itemFieldsResult); mainPanel = new GeonaDataViewMainPanel(applicationBus, getClientHeight(), itemFieldsResult); RootPanel.get(APP_DIV).add(mainPanel); initApplication(); } }); } private void initApplication() { Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { GeoportalDataViewerServiceAsync.Util.getInstance() .getInitialConfiguration(new ControlledCallBack() { @Override public void onFailure(Throwable caught) { Window.alert(caught.getMessage()); } @Override public void after() { RootPanel.get(APP_DIV).remove(loaderApp); } @Override public void onSuccess(ViewerConfiguration result) { super.onSuccess(result); GWT.log("Received init config : " + result); GWT.log("Loading base layers, count : " + result.getBaseLayers().size()); GeoportalDataViewer.getStatus().setConfig(result); listBaseMapLayers = result.getBaseLayers(); mainPanel.setBaseLayers(result.getBaseLayers()); BaseMapLayer firstBaseLayer = result.getBaseLayers().get(0); // Passing the first base map layer that will be applied as first base layer olMapMng = new OLMapManager(mainPanel.getMapPanel().getElement().getId(), layerManager.getLayerManagerBus(), firstBaseLayer); OpenLayerMap olMap = olMapMng.getOLMap(); layerManager.setOLMap(olMap); mainPanel.setMap(olMap); updateSize(); ScriptInjector.fromUrl( "//cdnjs.cloudflare.com/ajax/libs/nanogallery2/3.0.5/jquery.nanogallery2.min.js") .setWindow(ScriptInjector.TOP_WINDOW).inject(); GWT.log("Loading collections, count " + result.getAvailableCollections().size()); mainPanel.setAvailableCollections(result.getAvailableCollections().values()); if (paramGeonaItemID != null) { if (paramGeonaItemType == null) { Window.alert( "Missing parameter " + GeoportalDataViewerConstants.GET_GEONA_ITEM_TYPE + " (GeoNa Data Type) where to search the item id: " + paramGeonaItemID); return; } GeoportalItemReferences gir = new GeoportalItemReferences(paramGeonaItemID, paramGeonaItemType); applicationBus.fireEvent(new ShowDetailsEvent(gir, null, null)); } // TODO LOAD INITIAL LAYERS GWT.log("DONE INIT LOAD"); } }); } }); Window.addResizeHandler(new ResizeHandler() { @Override public void onResize(ResizeEvent event) { updateSize(); } }); bindEvents(); RootPanel.get(APP_DIV).add(attributionDiv); } public static ViewerStatus getStatus() { return viewerStatus; } public static List getListBaseMapLayers() { return listBaseMapLayers; } /** * Update window size. */ public void updateSize() { int rootHeight = getClientHeight(); int height = rootHeight; mainPanel.setPanelsHeight(height); GWT.log("Set height: " + height); } public int getClientHeight() { RootPanel principalDiv = RootPanel.get(APP_DIV); int topBorder = principalDiv.getAbsoluteTop(); int rootHeight = Window.getClientHeight() - topBorder; return rootHeight; } /** * Bind events. */ private void bindEvents() { applicationBus.addHandler(OpenCollectionEvent.TYPE, new OpenCollectionEventHandler() { @Override public void onOpenCollection(OpenCollectionEvent openCollectionEvent) { GWT.log("OpenCollectionEvent Fired event: " + openCollectionEvent); // Check if ID is available String collId = openCollectionEvent.getCollectionId(); ViewerConfiguration theConfig = GeoportalDataViewer.getStatus().getViewerConfig(); Set ucdIds = theConfig.getAvailableCollections().keySet(); if (!ucdIds.contains(collId)) { GWT.log("!! Collection " + collId + " is not available"); Window.alert("Collection " + collId + " is not found."); } else { GCubeCollection toOpen = theConfig.getAvailableCollections().get(collId); // Check if indexes is empty if (toOpen.getIndexes() == null || toOpen.getIndexes().isEmpty()) { GWT.log("Unexpected empty indexes in collection " + toOpen); Window.alert("Cannot open collection index layer for " + toOpen.getUcd().getName() + "."); } // TODO Get Default Index Layer // For now we just take the first - only 1 is expected IndexLayerDV layer = toOpen.getIndexes().get(0); // Open Index Layer layerManager.addIndexLayer(layer, toOpen.getUcd().getProfileID()); } } }); applicationBus.addHandler(CloseCollectionEvent.TYPE, new CloseCollectionEventHandler() { }); // applicationBus.addHandler(OpenCollectionEvent.TYPE, openCollectionEvent -> { // GWT.log("Fired event: " + openCollectionEvent); // // Check if ID is available // String collId = openCollectionEvent.getCollectionId(); // ViewerConfiguration theConfig = GeoportalDataViewer.getStatus().getViewerConfig(); // // Set ucdIds = theConfig.getAvailableCollections().keySet(); // // if (!ucdIds.contains(collId)) { // GWT.log("!! Collection " + collId + " is not available"); // Window.alert("Collection " + collId + " is not found."); // } else { // GCubeCollection toOpen = theConfig.getAvailableCollections().get(collId); // // // Check if indexes is empty // if (toOpen.getIndexes() == null || toOpen.getIndexes().isEmpty()) { // GWT.log("Unexpected empty indexes in collection " + toOpen); // Window.alert("Cannot open collection index layer for " + toOpen.getUcd().getName() + "."); // } // // TODO Get Default Index Layer // // For now we just take the first - only 1 is expected // IndexLayerDV layer = toOpen.getIndexes().get(0); // // Open Index Layer // // layerManager.addIndexLayer(layer); // // } // }); applicationBus.addHandler(ShowDetailsEvent.TYPE, new ShowDetailsEventHandler() { @Override public void onShowDetails(ShowDetailsEvent showDetailsEvent) { GWT.log("Fired event: " + showDetailsEvent); String projectID = showDetailsEvent.getProjectID(); String profileID = showDetailsEvent.getProfileID(); if (projectID == null) { Window.alert("Item Id not found"); return; } // TODO boolean found = false; GWT.log("Product with id: " + projectID + " found? " + found); GeoportalDataViewerServiceAsync.Util.getInstance().getProjectViewForId(profileID, projectID, new AsyncCallback() { @Override public void onFailure(Throwable caught) { Window.alert(caught.getMessage()); mainPanel.hidePanelDetails(); } @Override public void onSuccess(ProjectView result) { mainPanel.showAsDetails(result, showDetailsEvent.getGeonaItemRef()); } }); } }); applicationBus.addHandler(AddedLayerToMapEvent.TYPE, new AddedLayerToMapEventHandler() { @Override public void onLayerRendered(AddedLayerToMapEvent addedLayerToMapEvent) { GWT.log("Fired AddedLayerToMapEvent " + addedLayerToMapEvent.getLayerItem() + "layer type: " + addedLayerToMapEvent.getLayerType()); try { GWT.log("onLayerRendered Timer PART MUST BE REVISITED"); attempt = 0; if (paramGeonaItemID != null) { // waiting for record retrieved by service before calling the WFS final int MAX_RETRY = 15; Timer timer = new com.google.gwt.user.client.Timer() { @Override public void run() { attempt++; GWT.log("waiting get record: " + attempt); ProjectView record = mainPanel.getDisplayedProject(); if (record != null) { this.cancel(); GWT.log("cancelled timer"); performWFSQueryOnCentroid(record); } if (attempt > MAX_RETRY) { GWT.log("MAX_RETRY reached, cancelled timer"); this.cancel(); } } }; timer.scheduleRepeating(1000); } } catch (Exception e) { // TODO: handle exception } LAYER_TYPE layerType = addedLayerToMapEvent.getLayerType(); if (layerType != null) { switch (layerType) { case BASE: break; case OVERLAY: mainPanel.showOverlayLayers(layerManager.getOverlayLayerManager().getPanel()); break; default: break; } } } }); applicationBus.addHandler(ZoomOutOverMinimumEvent.TYPE, new ZoomOutOverMinimumEventHandler() { @Override public void onZoomOut(ZoomOutOverMinimumEvent zoomOutEvent) { if (mainPanel.getDisplayedProject() == null && !olMapMng.isQueryPointActive()) { olMapMng.hidePopInfo(); layerManager.removeAllDetailLayers(); } mainPanel.hideOverlayLayers(); // layerManager.getOverlayLayerManager().hide(); // hidePopupLayers(); } }); applicationBus.addHandler(ClosedViewDetailsEvent.TYPE, new ClosedViewDetailsEventHandler() { @Override public void onClosed(ClosedViewDetailsEvent closedViewDetailsEvent) { olMapMng.hidePopInfo(); } }); applicationBus.addHandler(MapExtentToEvent.TYPE, new MapExtentToEventHandler() { @Override public void onExtentEvent(MapExtentToEvent mapExtentToEvent) { // TODO Auto-generated method stub } }); applicationBus.addHandler(DoActionOnDetailLayersEvent.TYPE, new DoActionOnDetailLayersEventHandler() { @Override public void onDoActionOnDetailLayers(DoActionOnDetailLayersEvent doLayerActionEvent) { DO_LAYER_ACTION doAction = doLayerActionEvent.getDoAction(); GWT.log("event: " + doAction); GWT.log("layer source: " + doLayerActionEvent.getLayerItem().getName()); OpenLayerMap olMap = olMapMng.getOLMap(); switch (doAction) { case OPACITY: GWT.log("opacity: " + doLayerActionEvent.getOpacity()); olMap.setWMSDetailLayerOpacity(doLayerActionEvent.getLayerItem(), doLayerActionEvent.getOpacity()); break; case SWAP: SwapLayer swLS = doLayerActionEvent.getSourceLayerSwap(); SwapLayer swLT = doLayerActionEvent.getTargetLayerSwap(); GWT.log("SWAPPING source " + swLS.getLayerItem().getName() + ", target: " + swLT.getLayerItem().getName()); olMap.swapDetailsLayers(swLS, swLT); break; case VISIBILITY: GWT.log("visibility: " + doLayerActionEvent.getVisibility()); olMap.setWMSDetailLayerVisible(doLayerActionEvent.getLayerItem(), doLayerActionEvent.getVisibility()); break; default: break; } } }); applicationBus.addHandler(ChangeMapLayerEvent.TYPE, new ChangeMapLayerEventHandler() { @Override public void onChangeBaseMapLayer(ChangeMapLayerEvent changeMapLayerEvent) { BaseMapLayer baseLayer = changeMapLayerEvent.getBaseMapLayer(); if (baseLayer == null) return; String attributionHTML = "
" + baseLayer.getAttribution() + "
"; olMapMng.getOLMap().changeBaseMap(baseLayer); // THE OSM Contributors are automatically added by gwt-ol, others ones not. if (!baseLayer.getType().equals(BaseMapLayer.OL_BASE_MAP.OSM)) { attributionDiv.setHTML(attributionHTML); } else attributionDiv.setHTML(""); } }); // applicationBus.addHandler(ShowPopupOnCentroiEvent.TYPE, new ShowPopupOnCentroiEventHandler() { // // @Override // public void onShowPopup(ShowPopupOnCentroiEvent showPopupOnCentroiEvent) { // // if (showPopupOnCentroiEvent.getRecord() != null) // performWFSQueryOnCentroid(showPopupOnCentroiEvent.getRecord()); // // } // }); applicationBus.addHandler(SearchPerformedEvent.TYPE, new SearchPerformedEventHandler() { @Override public void onSearchDone(SearchPerformedEvent searchPerformedEvent) { if (searchPerformedEvent != null) { LinkedHashMap wmsMap = olMapMng.getOLMap().getWmsLayerMap(); String firstWMSKey = wmsMap.keySet().iterator().next(); List result = searchPerformedEvent.getData(); if (result != null && result.size() > 0) { String cqlFilter = "product_id IN("; for (DocumentDV documentDV : result) { cqlFilter += "'" + documentDV.getProjectID() + "',"; } cqlFilter = cqlFilter.substring(0, cqlFilter.length() - 1) + ")"; olMapMng.getOLMap().setCQLFilterToWMSLayer(firstWMSKey, cqlFilter); } else { olMapMng.getOLMap().setCQLFilterToWMSLayer(firstWMSKey, null); } if (searchPerformedEvent.isSearchReset()) { olMapMng.getOLMap().setCQLFilterToWMSLayer(firstWMSKey, null); } } } }); } // /** // * Handler popu closer. // * // * @param divId the div id // * @param overlayId the overlay id // */ // public static native void handlerPopuCloser(String divId, String overlayId) /*-{ // var closer = $doc.getElementById(divId); // var overlay = $doc.getElementById(overlayId); // closer.onclick = function() { // overlay.setPosition(undefined); // closer.blur(); // return false; // }; // // }-*/; private void performWFSQueryOnCentroid(ProjectView project) { if (project != null) { Double x = project.getCentroidLong(); Double y = project.getCentroidLat(); GWT.log("X: " + x + ", Y:" + y); if (x != null && y != null) { Coordinate transfCoord = MapUtils.transformCoordiante(new Coordinate(x, y), MAP_PROJECTION.EPSG_4326.getName(), MAP_PROJECTION.EPSG_3857.getName()); GeoQuery select = olMapMng.toDataPointQuery(transfCoord, false); GWT.log("GeoQuery: " + select); // GeoportalDataViewerConstants.print("fireEvent QueryDataEvent"); ExtentWrapped toExt = new ExtentWrapped(transfCoord.getX(), transfCoord.getY(), transfCoord.getX(), transfCoord.getY()); layerManager.getLayerManagerBus().fireEvent(new QueryDataEvent(select, toExt, project.getTheProjectDV().getId(), true, MapEventType.ADDED_CENTROID_LAYER_TO_MAP)); } else { GeoportalDataViewerConstants .printJs("I cannot select the point one or both coordiantes are null. X: " + x + ", Y:" + y); } } } }