package com.lmitsoftware.ctf; import java.net.URISyntaxException; import java.net.URL; import java.util.Collections; import java.util.List; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import mobi.jenkinsci.commons.Account; import mobi.jenkinsci.commons.Config; import mobi.jenkinsci.exceptions.TwoPhaseAuthenticationRequiredException; import mobi.jenkinsci.model.AbstractNode; import mobi.jenkinsci.model.ItemNode; import mobi.jenkinsci.model.RawBinaryNode; import mobi.jenkinsci.net.UrlPath; import mobi.jenkinsci.plugin.Plugin; import mobi.jenkinsci.plugin.PluginConfig; import org.apache.log4j.Logger; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import com.lmitsoftware.ctf.model.poc.PocNodesProvider; import com.lmitsoftware.ctf.model.poc.ProjectSprint; import com.lmitsoftware.ctf.model.poc.ProjectsSprintPlanEntry; public class CTFPlugin implements Plugin { private static final Logger log = Logger.getLogger(CTFPlugin.class); private String pluginName; private Injector injector; @Inject private Config config; @Override public AbstractNode processRequest(Account account, HttpServletRequest req, final PluginConfig pluginConf, String pluginName) throws Exception { this.pluginName = pluginName; log.debug("Query HTTP-" + req.getMethod() + ": " + req.getRequestURI()); String imageName = req.getParameter("image"); if (imageName != null && imageName.startsWith("sprint")) { return getSprintStatusImage(req, pluginConf, imageName); } ItemNode rootNode = new ItemNode(); rootNode.addNode((ItemNode) getRootNode(req, pluginConf)); return rootNode; } private ItemNode getRootNode(HttpServletRequest req, final PluginConfig pluginConf) throws URISyntaxException { PocNodesProvider.Factory nodesFactory = injector.getInstance(PocNodesProvider.Factory.class); ItemNode outNode = (ItemNode) nodesFactory.create(new UrlPath(req.getPathInfo()), pluginConf).get(); return outNode; } private RawBinaryNode getSprintStatusImage(HttpServletRequest req, PluginConfig pluginConf, String imageName) throws Exception { String[] imageNameParts = imageName.split("\\."); ProjectSprint sprintDetails = (ProjectSprint) lookupNode(getRootNode(req, pluginConf), imageNameParts[0]); RawBinaryNode outImage = new RawBinaryNode(); outImage.setData(sprintDetails.getImage()); outImage.setHttpContentType(config.MIME_TYPES.get(imageNameParts[1])); outImage.setCacheable(false); return outImage; } private ItemNode lookupNode(ItemNode node, String nodeTitle) { String path = node.getPath(); if(path != null && path.equalsIgnoreCase(nodeTitle)) { return node; } else { List<ItemNode> payload = node.getPayload(); if(payload == null) { return null; } for (ItemNode childNode : payload) { ItemNode foundNode = lookupNode(childNode, nodeTitle); if(foundNode != null) { return foundNode; } } } return null; } @Override public void init() { } @Override public String getType() { return "TeamForge"; } @Override public void configure(Properties configuration) { injector = Guice.createInjector(new CTFPluginModule()); } @Override public List<ItemNode> getEntryPoints(PluginConfig pluginConf) throws Exception { return Collections.singletonList((ItemNode) new ProjectsSprintPlanEntry()); } @Override public ItemNode claim(Account account, PluginConfig pluginConf, URL url) throws Exception { // TODO Auto-generated method stub return null; } @Override public List<ItemNode> getReleaseNotes(Account account, PluginConfig pluginConf, String version, String url, HttpServletRequest request) throws Exception { return null; } @Override public String validateConfig(HttpServletRequest req, Account account, PluginConfig pluginConf) throws TwoPhaseAuthenticationRequiredException { return null; } }