package org.trianacode.http; import org.thinginitself.http.RequestContext; import org.thinginitself.http.RequestProcessException; import org.thinginitself.http.Resource; import org.thinginitself.http.target.DirectoryTarget; import org.thinginitself.http.target.TargetResource; import org.trianacode.config.TrianaProperties; import org.trianacode.taskgraph.tool.FileToolbox; import org.trianacode.taskgraph.tool.Tool; import org.trianacode.taskgraph.tool.Toolbox; import java.io.File; import java.util.ArrayList; import java.util.List; /** * @author Andrew Harrison * @version 1.0.0 Aug 11, 2010 */ public class ToolboxResource extends TargetResource { private Toolbox toolbox; public ToolboxResource(Toolbox toolbox) { super(PathController.getInstance().getToolboxPath(toolbox)); this.toolbox = toolbox; if (!(toolbox instanceof FileToolbox)) { throw new IllegalArgumentException("Can only be a resource for local file tools"); } ToolboxRenderer rend = new ToolboxRenderer(); List<String> libs = ((FileToolbox) toolbox).getLibPaths(); rend.init(toolbox, libs); getPathTree().addLocatable(new RendererResource(PathController.getInstance().getToolboxPath(toolbox), rend, TrianaProperties.TOOLBOX_DESCRIPTION_TEMPLATE_PROPERTY)); getPathTree().addLocatable(new RendererResource(PathController.getInstance().getToolboxPath(toolbox) + "classpath.html", rend, TrianaProperties.TOOL_CP_HTML_TEMPLATE_PROPERTY)); getPathTree().addLocatable(new RendererResource(PathController.getInstance().getToolboxPath(toolbox) + "classpath.xml", rend, TrianaProperties.TOOL_CP_XML_TEMPLATE_PROPERTY, "text/xml")); File classes = ((FileToolbox) toolbox).getFile("classes"); if (classes != null) { getPathTree().addLocatable(new DirectoryTarget(PathController.getInstance().getToolboxPath(toolbox) + "classes/", classes)); } File lib = ((FileToolbox) toolbox).getFile("lib"); if (lib != null) { getPathTree().addLocatable(new DirectoryTarget(PathController.getInstance().getToolboxPath(toolbox) + "lib/", lib)); } } public Resource getResource(RequestContext context) throws RequestProcessException { String toolPart = PathController.getInstance().getToolPart(toolbox.getName(), context.getRequestTarget().toString()); if (toolPart != null && toolPart.length() > 0) { String[] comps = toolPart.split("/"); List<String> l = new ArrayList<String>(); for (String comp : comps) { if (comp.indexOf(".") == -1) { l.add(comp); } } if (l.size() > 0) { List<Tool> tools = toolbox.getTools(); Tool t = null; while (l.size() > 0) { StringBuilder sb = new StringBuilder(l.get(0)); for (int i = 1; i < l.size(); i++) { String s = l.get(i); sb.append(".").append(s); } for (Tool tool : tools) { if (tool.getQualifiedToolName().equals(sb.toString())) { t = tool; break; } } if (t != null) { break; } l.remove(l.size() - 1); } if (t != null) { ToolResource res = new ToolResource(PathController.getInstance().getToolPath(t), t); getPathTree().addLocatable(res); return res.getResource(context); } } } return super.getResource(context); } }