From 7d6f306ae21757162d7ec0d6f8b0b541feae3d12 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 27 Jun 2009 20:43:18 +0000 Subject: [PATCH] Introduce provisioning git-svn-id: https://svn.argeo.org/slc/trunk@2611 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../mvc/provisioning/EclipseUpdateSite.java | 17 ++++ .../EclipseUpdateSiteCategory.java | 32 +++++++ .../EclipseUpdateSiteFeature.java | 26 ++++++ .../EclipseUpdateSiteHandler.java | 83 +++++++++++++++++++ .../web/mvc/provisioning/FileProvider.java | 63 ++++++++++++++ .../web/mvc/provisioning/PluginHandler.java | 61 ++++++++++++++ 6 files changed, 282 insertions(+) create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSite.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteCategory.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteFeature.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteHandler.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/FileProvider.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/PluginHandler.java diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSite.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSite.java new file mode 100644 index 000000000..36a09491b --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSite.java @@ -0,0 +1,17 @@ +package org.argeo.slc.web.mvc.provisioning; + +import java.util.ArrayList; +import java.util.List; + +public class EclipseUpdateSite { + private List features = new ArrayList(); + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteCategory.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteCategory.java new file mode 100644 index 000000000..04e8e2bda --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteCategory.java @@ -0,0 +1,32 @@ +package org.argeo.slc.web.mvc.provisioning; + +public class EclipseUpdateSiteCategory { + private String name; + private String label; + private String description; + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteFeature.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteFeature.java new file mode 100644 index 000000000..dc24f28f6 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteFeature.java @@ -0,0 +1,26 @@ +package org.argeo.slc.web.mvc.provisioning; + +import java.util.ArrayList; +import java.util.List; + +public class EclipseUpdateSiteFeature { + private String name; + private List categories = new ArrayList(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getCategories() { + return categories; + } + + public void setCategories(List categories) { + this.categories = categories; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteHandler.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteHandler.java new file mode 100644 index 000000000..7718ca38a --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/EclipseUpdateSiteHandler.java @@ -0,0 +1,83 @@ +package org.argeo.slc.web.mvc.provisioning; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; +import java.util.jar.JarInputStream; +import java.util.jar.Manifest; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.core.io.Resource; +import org.springframework.web.HttpRequestHandler; + +/** An Eclipse update site, serving site.xml features/* and plugins/*. */ +public class EclipseUpdateSiteHandler implements HttpRequestHandler { + private FileProvider provider; + private String baseVersion = "0.9.4-SNAPSHOT"; + + private EclipseUpdateSite updateSite; + + public void handleRequest(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + String path = request.getPathInfo(); + StringTokenizer stS = new StringTokenizer(path, "/"); + String distribution = stS.nextToken(); + + StringBuffer buf = new StringBuffer(""); + buf.append(""); + + List usedCategories = new ArrayList(); + for (EclipseUpdateSiteFeature feature : updateSite.getFeatures()) { + Resource bundle = provider.getBundle(distribution, feature + .getName(), baseVersion); + JarInputStream in = new JarInputStream(bundle.getInputStream()); + Manifest mf = in.getManifest(); + String version = mf.getMainAttributes().getValue("Bundle-Version"); + String featureId = feature.getName(); + buf.append("\n"); + + for (EclipseUpdateSiteCategory category : feature.getCategories()) { + usedCategories.add(category); + buf.append(" \n"); + } + buf.append("\n\n"); + } + + for (EclipseUpdateSiteCategory category : usedCategories) { + buf.append("\n"); + buf.append(" ").append(category.getDescription()) + .append("\n"); + buf.append("\n\n"); + } + + buf.append(""); + + response.getWriter().print(buf.toString()); + } + + public void setProvider(FileProvider provider) { + this.provider = provider; + } + + public void setBaseVersion(String baseVersion) { + this.baseVersion = baseVersion; + } + + public void setUpdateSite(EclipseUpdateSite updateSite) { + this.updateSite = updateSite; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/FileProvider.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/FileProvider.java new file mode 100644 index 000000000..6751e09f8 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/FileProvider.java @@ -0,0 +1,63 @@ +package org.argeo.slc.web.mvc.provisioning; + +import java.io.InputStream; +import java.io.OutputStream; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; +import org.springframework.core.io.Resource; + +public class FileProvider { + private final static Log log = LogFactory.getLog(FileProvider.class); + + private Resource base; + + public void read(String distribution, String name, String version, + OutputStream out) { + Resource bundle = getBundle(distribution, name, version); + InputStream in = null; + try { + in = bundle.getInputStream(); + IOUtils.copy(in, out); + } catch (Exception e) { + throw new SlcException("Cannot read bundle for " + name + " (" + + version + ")",e); + } finally { + IOUtils.closeQuietly(in); + } + } + + public Resource getBundle(String distribution, String name, String version) { + try { + String shortVersion = version; + int indR = version.indexOf("-r"); + if (indR > -1) { + shortVersion = version.substring(0, indR); + } + + int indS = shortVersion.indexOf(".SNAPSHOT"); + if (indS > -1) { + StringBuffer buf = new StringBuffer(shortVersion); + buf.setCharAt(indS, '-'); + shortVersion = buf.toString(); + } + + if (log.isDebugEnabled()) + log.debug("Short version for " + name + ": " + shortVersion); + + Resource res = base.createRelative("lib/" + name + "-" + + shortVersion + ".jar"); + return res; + } catch (Exception e) { + throw new SlcException("Cannot get bundle for " + name + " (" + + version + ")",e); + } + } + + public void setBase(Resource base) { + this.base = base; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/PluginHandler.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/PluginHandler.java new file mode 100644 index 000000000..7f44d0d20 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/PluginHandler.java @@ -0,0 +1,61 @@ +package org.argeo.slc.web.mvc.provisioning; + +import java.io.IOException; +import java.util.StringTokenizer; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; +import org.springframework.web.HttpRequestHandler; + +public class PluginHandler implements HttpRequestHandler { + private final static Log log = LogFactory.getLog(PluginHandler.class); + + private FileProvider provider; + + public void handleRequest(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // log.debug(request.getContextPath()); + // log.debug(request.getServletPath()); + // log.debug(request.getPathInfo()); + // log.debug(request.getPathTranslated()); + // log.debug(request.getLocalName()); + // log.debug(request.getLocalAddr()); + // log.debug(request.getQueryString()); + // log.debug(request.getRequestURL()); + // log.debug(request.getRequestURI()); + + String path = request.getPathInfo(); + + if (log.isDebugEnabled()) + log.debug("Request " + path); + + StringTokenizer stS = new StringTokenizer(path, "/"); + String distribution = stS.nextToken(); + stS.nextToken();// plugins + String fileName = stS.nextToken(); + + int ind_ = fileName.indexOf('_'); + String moduleName; + if (ind_ > -1) + moduleName = fileName.substring(0, ind_); + else + throw new SlcException("Cannot determine version for " + fileName); + + String versionAndExtension = fileName.substring(ind_ + 1); + int indExt = versionAndExtension.lastIndexOf('.'); + String moduleVersion = versionAndExtension.substring(0, indExt); + + provider.read(distribution, moduleName, moduleVersion, response + .getOutputStream()); + } + + public void setProvider(FileProvider provider) { + this.provider = provider; + } + +} -- 2.39.2