package org.apache.ode.axis2.service; import org.apache.ode.store.ProcessStoreImpl; import org.apache.ode.bpel.iapi.ProcessConf; import org.apache.axis2.engine.AxisConfiguration; import org.apache.axis2.description.AxisService; import javax.xml.namespace.QName; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import java.io.*; import java.util.List; /** * handles a set of URLs all starting with /deployment to publish all files in * deployed bundles, services and processes. */ public class DeploymentBrowser { private ProcessStoreImpl _store; private AxisConfiguration _config; private File _appRoot; public DeploymentBrowser(ProcessStoreImpl store, AxisConfiguration config, File appRoot) { _store = store; _config = config; _appRoot = appRoot; } // A fake filter, directly called from the ODEAxisServlet public boolean doFilter(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String requestURI = request.getRequestURI(); int deplUri = requestURI.indexOf("/deployment"); if (deplUri > 0) { int offset = requestURI.length() > (deplUri + 11) ? 1 : 0; final String[] segments = requestURI.substring(deplUri + 11 + offset).split("/"); if (segments.length == 0 || segments[0].length() == 0) { renderHtml(response, "ODE Deployment Browser", new DocBody() { public void render(Writer out) throws IOException { out.write("<p><a href=\"bundles/\">Deployed Bundles</a></p>"); out.write("<p><a href=\"services/\">Process Services</a></p>"); out.write("<p><a href=\"processes/\">Deployed Processes</a></p>"); } }); } else if (segments.length > 0) { if ("services".equals(segments[0])) { if (segments.length == 1) { renderHtml(response, "Services Implemented by Your Processes", new DocBody() { public void render(Writer out) throws IOException { for (Object serviceName : _config.getServices().keySet()) if (!"Version".equals(serviceName)) out.write("<p><a href=\"" + serviceName + "\">" + serviceName + "</a></p>"); } }); } else { final String serviceName = requestURI.substring(deplUri + 12 + 9); final AxisService axisService = _config.getService(serviceName); if (axisService != null) { renderXml(response, new DocBody() { public void render(Writer out) throws IOException { if ("InstanceManagement".equals(serviceName) || "ProcessManagement".equals(serviceName)) write(out, new File(_appRoot, "pmapi.wsdl").getPath()); else if ("DeploymentService".equals(serviceName)) write(out, new File(_appRoot, "deploy.wsdl").getPath()); else write(out, axisService.getFileName().getFile()); } }); } else { renderHtml(response, "Service Not Found", new DocBody() { public void render(Writer out) throws IOException { out.write("<p>Couldn't find service " + serviceName + "</p>"); } }); } } } else if ("processes".equals(segments[0])) { if (segments.length == 1) { renderHtml(response, "Deployed Processes", new DocBody() { public void render(Writer out) throws IOException { for (QName process :_store.getProcesses()) out.write("<p><a href=\"" + process.getLocalPart() + "?ns=" + process.getNamespaceURI() + "\">" + process + "</a></p>"); } }); } else { final String processName = requestURI.substring(deplUri + 12 + 10); final String processNs = request.getParameter("ns"); final ProcessConf pconf = _store.getProcessConfiguration(new QName(processNs, processName)); if (pconf != null) { renderXml(response, new DocBody() { public void render(Writer out) throws IOException { write(out, new File(pconf.getBaseURI().toURL().getFile(), pconf.getBpelDocument()).getPath()); } }); } else { renderHtml(response, "Process Not Found", new DocBody() { public void render(Writer out) throws IOException { out.write("<p>Couldn't find process " + new QName(processNs, processName) + "</p>"); } }); } } } else if ("bundles".equals(segments[0])) { if (segments.length == 1) { renderHtml(response, "Deployment Bundles", new DocBody() { public void render(Writer out) throws IOException { for (String bundle : _store.getPackages()) out.write("<p><a href=\"" + bundle + "\">" + bundle + "</a></p>"); } }); } else if (segments.length == 2) { renderHtml(response, "Files in Bundle " + segments[1], new DocBody() { public void render(Writer out) throws IOException { List<QName> processes = _store.listProcesses(segments[1]); if (processes != null) { List<File> files = _store.getProcessConfiguration(processes.get(0)).getFiles(); for (File file : files) { String relativePath = file.getPath().substring(_store.getDeployDir().getPath().length() + 1); out.write("<p><a href=\"" + relativePath + "\">" + relativePath + "</a></p>"); } } else { out.write("<p>Couldn't find bundle " + segments[2] + "</p>"); } } }); } else if (segments.length > 2) { List<QName> processes = _store.listProcesses(segments[1]); if (processes != null) { List<File> files = _store.getProcessConfiguration(processes.get(0)).getFiles(); for (final File file : files) { String relativePath = requestURI.substring(deplUri + 12 + 9 + segments[1].length()); if (file.getPath().indexOf(relativePath) >= 0) { renderXml(response, new DocBody() { public void render(Writer out) throws IOException { write(out, file.getPath()); } }); return true; } } } else { renderHtml(response, "No Bundle Found", new DocBody() { public void render(Writer out) throws IOException { out.write("<p>Couldn't find bundle " + segments[2] + "</p>"); } }); } } } } return true; } return false; } static interface DocBody { void render(Writer out) throws IOException; } private void renderHtml(HttpServletResponse response, String title, DocBody docBody) throws IOException { response.setContentType("text/html"); Writer out = response.getWriter(); out.write("<html><header><style type=\"text/css\">" + CSS + "</style></header><body>\n"); out.write("<h2>" + title + "</h2><p/>\n"); docBody.render(out); out.write("</body></html>"); } private void renderXml(HttpServletResponse response, DocBody docBody) throws IOException { response.setContentType("text/xml"); response.setCharacterEncoding("UTF-8"); Writer out = response.getWriter(); docBody.render(out); } private void write(Writer out, String filePath) throws IOException { BufferedReader wsdlReader = new BufferedReader(new FileReader(filePath)); String line; while((line = wsdlReader.readLine()) != null) out.write(line + "\n"); wsdlReader.close(); } private static final String CSS = "body {\n" + " font: 75% Verdana, Helvetica, Arial, sans-serif;\n" + " background: White;\n" + " color: Black;\n" + " margin: 1em;\n" + " padding: 1em;\n" + "}\n" + "\n" + "h1, h2, h3, h4, h5, h6 {\n" + " color: Black;\n" + " clear: left;\n" + " font: 100% Verdana, Helvetica, Arial, sans-serif;\n" + " margin: 0;\n" + " padding-left: 0.5em;\n" + "} \n" + "\n" + "h1 {\n" + " font-size: 150%;\n" + " border-bottom: none;\n" + " text-align: right;\n" + " border-bottom: 1px solid Gray;\n" + "}\n" + " \n" + "h2 {\n" + " font-size: 130%;\n" + " border-bottom: 1px solid Gray;\n" + "}\n" + "\n" + "h3 {\n" + " font-size: 120%;\n" + " padding-left: 1.0em;\n" + " border-bottom: 1px solid Gray;\n" + "}\n" + "\n" + "h4 {\n" + " font-size: 110%;\n" + " padding-left: 1.5em;\n" + " border-bottom: 1px solid Gray;\n" + "}\n" + "\n" + "p {\n" + " text-align: justify;\n" + " line-height: 1.5em;\n" + " padding-left: 1.5em;\n" + "}\n" + "\n" + "a {\n" + " text-decoration: underline;\n" + " color: Black;\n" + "}"; }