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()); } }