From: Mathieu Baudier Date: Thu, 10 Sep 2020 08:11:36 +0000 (+0200) Subject: Add Site Map to studio/mvc. X-Git-Tag: argeo-suite-2.1.16~98 X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=commitdiff_plain;h=baf563976c7595d5e50f2e38bb684196618b402f Add Site Map to studio/mvc. --- diff --git a/systems/org.argeo.suite.studio/.classpath b/systems/org.argeo.suite.studio/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/systems/org.argeo.suite.studio/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/systems/org.argeo.suite.studio/.project b/systems/org.argeo.suite.studio/.project index ea4f91d..fa5c615 100644 --- a/systems/org.argeo.suite.studio/.project +++ b/systems/org.argeo.suite.studio/.project @@ -5,6 +5,11 @@ + + org.eclipse.jdt.core.javabuilder + + + org.eclipse.pde.ManifestBuilder @@ -23,5 +28,6 @@ org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature diff --git a/systems/org.argeo.suite.studio/bnd.bnd b/systems/org.argeo.suite.studio/bnd.bnd index e69de29..2b2a02f 100644 --- a/systems/org.argeo.suite.studio/bnd.bnd +++ b/systems/org.argeo.suite.studio/bnd.bnd @@ -0,0 +1 @@ +Bundle-ActivationPolicy: lazy diff --git a/systems/org.argeo.suite.studio/e4xmi/mvc.e4xmi b/systems/org.argeo.suite.studio/e4xmi/mvc.e4xmi index 2faa633..1e72040 100644 --- a/systems/org.argeo.suite.studio/e4xmi/mvc.e4xmi +++ b/systems/org.argeo.suite.studio/e4xmi/mvc.e4xmi @@ -5,7 +5,9 @@ shellMaximized auth.cn=org.argeo.office.coworker,ou=roles,ou=node - + + + entityEditorArea diff --git a/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/RwtAppElem.java b/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/RwtAppElem.java new file mode 100644 index 0000000..635d350 --- /dev/null +++ b/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/RwtAppElem.java @@ -0,0 +1,21 @@ +package org.argeo.suite.studio.parts; + +import org.eclipse.rap.rwt.application.ApplicationConfiguration; +import org.osgi.framework.ServiceReference; + +/** Site map element representing an RWT application. */ +class RwtAppElem extends SiteElem { + private final static String CONTEXT_NAME = "contextName"; + + private final ServiceReference serviceReference; + + public RwtAppElem(ServiceReference serviceReference) { + super(serviceReference.getProperties().get(CONTEXT_NAME).toString()); + this.serviceReference = serviceReference; + } + + public ServiceReference getServiceReference() { + return serviceReference; + } + +} diff --git a/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/ServletElem.java b/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/ServletElem.java new file mode 100644 index 0000000..5165795 --- /dev/null +++ b/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/ServletElem.java @@ -0,0 +1,62 @@ +package org.argeo.suite.studio.parts; + +import java.util.Arrays; +import java.util.Collection; + +import javax.servlet.Servlet; + +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.service.http.context.ServletContextHelper; +import org.osgi.service.http.whiteboard.HttpWhiteboardConstants; + +/** Site map element which is a plain servlet. */ +class ServletElem extends SiteElem { + private final ServiceReference serviceReference; + + public ServletElem(ServiceReference serviceReference) { + super(extractPath(serviceReference)); + this.serviceReference = serviceReference; + } + + + + public ServiceReference getServiceReference() { + return serviceReference; + } + + + + private static String extractPath(ServiceReference serviceReference) { + Object servletPattern = serviceReference.getProperties() + .get(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN); + Object servletContextSelect = serviceReference.getProperties() + .get(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT); + String servletContextPath = ""; + if (servletContextSelect != null) { + try { + Collection> scSr = serviceReference.getBundle() + .getBundleContext() + .getServiceReferences(ServletContextHelper.class, servletContextSelect.toString()); + if (scSr.size() > 0) { + servletContextPath = scSr.iterator().next() + .getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH).toString(); + if (servletContextPath.equals("/"))// default servlet context + servletContextPath = ""; + } + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException(e); + } + } + + if (servletPattern instanceof String) + return servletContextPath + servletPattern.toString(); + else if (servletPattern instanceof String[]) { + String[] patterns = (String[]) servletPattern; + if (patterns.length == 2 && patterns[1].equals(patterns[0] + "/*")) // RAP servlets + return servletContextPath + patterns[0]; + return servletContextPath + Arrays.asList(patterns).toString(); + } else + throw new IllegalArgumentException("Cannot interpret servlet pattern " + servletPattern.getClass()); + } +} diff --git a/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/SiteElem.java b/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/SiteElem.java new file mode 100644 index 0000000..4931eab --- /dev/null +++ b/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/SiteElem.java @@ -0,0 +1,37 @@ +package org.argeo.suite.studio.parts; + +import org.argeo.eclipse.ui.TreeParent; + +/** Base class for site map elements. */ +abstract class SiteElem extends TreeParent { + + private final String path; + + public SiteElem(String path) { + super(extractLastSegment(path)); + this.path = path; + } + + public String getPath() { + return path; + } + + static String extractLastSegment(String path) { + if (path == null || path.equals("")) + throw new IllegalArgumentException("Path should not be null or empty."); + if (path.equals("/")) + return path; + String[] segments = path.split("/"); + for (int i = segments.length - 1; i >= 0; i--) { + if (!segments[i].equals("") && !segments[i].equals("*")) + return segments[i]; + } + return "/"; + } + + @Override + public String toString() { + return path; + } + +} diff --git a/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/SiteMapPart.java b/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/SiteMapPart.java new file mode 100644 index 0000000..db7911f --- /dev/null +++ b/systems/org.argeo.suite.studio/src/org/argeo/suite/studio/parts/SiteMapPart.java @@ -0,0 +1,96 @@ +package org.argeo.suite.studio.parts; + +import java.util.Collection; +import java.util.Map; +import java.util.TreeMap; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.servlet.Servlet; + +import org.argeo.eclipse.ui.AbstractTreeContentProvider; +import org.eclipse.e4.core.di.extensions.OSGiBundle; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.TreeViewerColumn; +import org.eclipse.rap.rwt.application.ApplicationConfiguration; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.osgi.framework.BundleContext; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; + +/** Overview of the URL paths provides by the system. */ +@SuppressWarnings("restriction") +public class SiteMapPart { +// private final static BundleContext bc = FrameworkUtil.getBundle(SiteMapPart.class).getBundleContext(); + + private TreeViewer viewer; + + @Inject + @OSGiBundle + BundleContext bc; + + @PostConstruct + public void createPartControl(Composite parent) { +// new Label(parent, SWT.NONE).setText("TEST"); +// + viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); +// viewer.getTree().setHeaderVisible(true); + +// viewer.setLabelProvider(new ColumnLabelProvider()); + + TreeViewerColumn column = new TreeViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(200); + column.getColumn().setText("Path"); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = -3122136344359358605L; + + public String getText(Object element) { + return ((SiteElem) element).getPath(); + } + + @Override + public Image getImage(Object element) { + return super.getImage(element); + } + + }); + + viewer.setContentProvider(new SitePathContentProvider()); + viewer.setInput(bc); + + } + + class SitePathContentProvider extends AbstractTreeContentProvider { + private static final long serialVersionUID = -5650173256183322051L; + + @Override + public Object[] getElements(Object inputElement) { + if (inputElement instanceof BundleContext) { + BundleContext bundleContext = (BundleContext) inputElement; + Map siteElems = new TreeMap<>(); + try { + Collection> rwtApps = bundleContext + .getServiceReferences(ApplicationConfiguration.class, null); + for (ServiceReference sr : rwtApps) { + RwtAppElem elem = new RwtAppElem(sr); + siteElems.put(elem.getPath(), elem); + } + Collection> plainServlets = bundleContext + .getServiceReferences(Servlet.class, null); + for (ServiceReference sr : plainServlets) { + ServletElem elem = new ServletElem(sr); + siteElems.put(elem.getPath(), elem); + } + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException(e); + } + return siteElems.values().toArray(); + } + return null; + } + + } +}