Add Site Map to studio/mvc.
[gpl/argeo-suite.git] / systems / org.argeo.suite.studio / src / org / argeo / suite / studio / parts / ServletElem.java
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 (file)
index 0000000..5165795
--- /dev/null
@@ -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<Servlet> serviceReference;
+
+       public ServletElem(ServiceReference<Servlet> serviceReference) {
+               super(extractPath(serviceReference));
+               this.serviceReference = serviceReference;
+       }
+       
+       
+
+       public ServiceReference<Servlet> getServiceReference() {
+               return serviceReference;
+       }
+
+
+
+       private static String extractPath(ServiceReference<Servlet> 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<ServiceReference<ServletContextHelper>> 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());
+       }
+}