From af874b12bcb864e1ee2b48e8d6e1fea3a584c53d Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 23 Jul 2009 12:09:29 +0000 Subject: [PATCH] Modular distributions git-svn-id: https://svn.argeo.org/slc/trunk@2733 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/pom.xml | 3 +- dep/org.argeo.slc.dep.server/pom.xml | 12 ++ dep/pom.xml | 32 +++- .../META-INF/MANIFEST.MF | 2 + .../META-INF/spring/eclipseUpdateSite.xml | 20 ++ .../META-INF/spring/manager.xml | 3 + .../META-INF/spring/osgi.xml | 1 + .../META-INF/MANIFEST.MF | 3 +- .../WEB-INF/provisioning-servlet.xml | 2 +- .../WEB-INF/slc-service-servlet.xml | 7 + .../build/VersionedResourceDistribution.java | 5 + .../build/ModularDistributionDescriptor.java | 24 +++ .../java/org/argeo/slc/osgiboot/OsgiBoot.java | 2 +- .../AbstractAvailableModules.java | 16 +- .../provisioning/AvailableModulesHtml.java | 24 ++- .../AvailableModulesOsgiBoot.java | 2 +- .../EclipseUpdateSiteHandler.java | 2 +- .../ListModularDistributions.java | 54 ++++++ .../argeo/slc/build/ModularDistribution.java | 2 +- runtime/org.argeo.slc.support.castor/pom.xml | 7 +- .../resources/org/argeo/slc/castor/build.xml | 16 ++ .../resources/org/argeo/slc/castor/msg.xml | 29 ++- .../resources/org/argeo/slc/castor/spring.xml | 3 + .../slc/castor/AbstractCastorTestCase.java | 2 +- .../castor/ModularDistributionCastorTest.java | 43 +++++ .../java/org/argeo/slc/osgi/OsgiBundle.java | 40 ++-- .../AbstractOsgiModularDistribution.java | 157 +++++++++++++++ .../osgi/build/BundleModularDistribution.java | 178 +++--------------- .../build/OsgiRuntimeModularDistribution.java | 49 +++++ 29 files changed, 538 insertions(+), 202 deletions(-) create mode 100644 modules/server/org.argeo.slc.server.main/META-INF/spring/eclipseUpdateSite.xml create mode 100644 runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/msg/build/ModularDistributionDescriptor.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/ListModularDistributions.java create mode 100644 runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/build.xml create mode 100644 runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/ModularDistributionCastorTest.java create mode 100644 runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/AbstractOsgiModularDistribution.java create mode 100644 runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/OsgiRuntimeModularDistribution.java diff --git a/demo/pom.xml b/demo/pom.xml index 6a6b21dbc..9f0a494c9 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -101,7 +101,8 @@ ${user.home}/dev/src/sparta/dist/runtime/target;in=*.jar, ${basedir}/site;in=*;ex=pom.xml;ex=target, - ${basedir}/../modules/server;in=*;ex=pom.xml;ex=target;ex=.* + ${basedir}/../modules/server;in=*;ex=pom.xml;ex=target;ex=.*, + ${basedir}/../modules/agent;in=*;ex=pom.xml;ex=target diff --git a/dep/org.argeo.slc.dep.server/pom.xml b/dep/org.argeo.slc.dep.server/pom.xml index 69db13590..5dc557105 100644 --- a/dep/org.argeo.slc.dep.server/pom.xml +++ b/dep/org.argeo.slc.dep.server/pom.xml @@ -12,6 +12,18 @@ jar Argeo SLC Dependencies Server + + + org.argeo.slc.dep + org.argeo.slc.dep.agent + ${project.version} + + + org.argeo.slc.dep + org.argeo.slc.dep.detached + ${project.version} + + org.argeo.slc.runtime diff --git a/dep/pom.xml b/dep/pom.xml index 1913d086c..91c3977fb 100644 --- a/dep/pom.xml +++ b/dep/pom.xml @@ -26,14 +26,44 @@ + + org.codehaus.mojo + buildnumber-maven-plugin + + false + + maven-jar-plugin - META-INF/MANIFEST.MF + target/classes/META-INF/MANIFEST.MF + + org.apache.felix + maven-bundle-plugin + ${version.maven-bundle-plugin} + + + ${project.artifactId} + ${project.version}-r${buildNumber} + + + + + org.argeo.maven.plugins + maven-argeo-osgi-plugin + + + + descriptors + + generate-resources + + + \ No newline at end of file diff --git a/modules/server/org.argeo.slc.server.main/META-INF/MANIFEST.MF b/modules/server/org.argeo.slc.server.main/META-INF/MANIFEST.MF index f5bfae305..28b30ae38 100644 --- a/modules/server/org.argeo.slc.server.main/META-INF/MANIFEST.MF +++ b/modules/server/org.argeo.slc.server.main/META-INF/MANIFEST.MF @@ -4,3 +4,5 @@ Bundle-Version: 0.11.4.SNAPSHOT Bundle-Name: SLC Server Main Require-Bundle: org.argeo.slc.specs, org.argeo.slc.support.equinox +Import-Package: org.argeo.slc.build, + org.argeo.slc.osgi.build diff --git a/modules/server/org.argeo.slc.server.main/META-INF/spring/eclipseUpdateSite.xml b/modules/server/org.argeo.slc.server.main/META-INF/spring/eclipseUpdateSite.xml new file mode 100644 index 000000000..6e8775c18 --- /dev/null +++ b/modules/server/org.argeo.slc.server.main/META-INF/spring/eclipseUpdateSite.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/server/org.argeo.slc.server.main/META-INF/spring/manager.xml b/modules/server/org.argeo.slc.server.main/META-INF/spring/manager.xml index eccb3544a..bf342bb6c 100644 --- a/modules/server/org.argeo.slc.server.main/META-INF/spring/manager.xml +++ b/modules/server/org.argeo.slc.server.main/META-INF/spring/manager.xml @@ -5,4 +5,7 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> + + + \ No newline at end of file diff --git a/modules/server/org.argeo.slc.server.main/META-INF/spring/osgi.xml b/modules/server/org.argeo.slc.server.main/META-INF/spring/osgi.xml index 43818e343..50237f47d 100644 --- a/modules/server/org.argeo.slc.server.main/META-INF/spring/osgi.xml +++ b/modules/server/org.argeo.slc.server.main/META-INF/spring/osgi.xml @@ -7,4 +7,5 @@ http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> + \ No newline at end of file diff --git a/modules/server/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF b/modules/server/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF index 83da4bfa0..834a4474a 100644 --- a/modules/server/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF +++ b/modules/server/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF @@ -48,4 +48,5 @@ Import-Package: net.sf.cglib.core, org.springframework.web.servlet, org.springframework.web.servlet.handler, org.springframework.web.servlet.mvc, - org.springframework.security.context + org.springframework.security.context, + org.springframework.security.providers diff --git a/modules/server/org.argeo.slc.webapp.war/WEB-INF/provisioning-servlet.xml b/modules/server/org.argeo.slc.webapp.war/WEB-INF/provisioning-servlet.xml index a0f4c6490..bc2df745c 100644 --- a/modules/server/org.argeo.slc.webapp.war/WEB-INF/provisioning-servlet.xml +++ b/modules/server/org.argeo.slc.webapp.war/WEB-INF/provisioning-servlet.xml @@ -35,7 +35,7 @@ /*/*/modules.html=availableModulesHtml /*/*/modules=availableModulesPlain - /*/*/osgiBoot=availableModulesOsgiBoot + /*/*/modularDistribution=availableModulesOsgiBoot /*/*/site.xml=updateSiteHandler diff --git a/modules/server/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml b/modules/server/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml index 9365eaac3..42f0ec533 100644 --- a/modules/server/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml +++ b/modules/server/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml @@ -103,6 +103,13 @@ + + + + + + diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/build/VersionedResourceDistribution.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/build/VersionedResourceDistribution.java index a813438ba..11044a2aa 100644 --- a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/build/VersionedResourceDistribution.java +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/build/VersionedResourceDistribution.java @@ -12,6 +12,11 @@ public class VersionedResourceDistribution extends ResourceDistribution super(); } + public VersionedResourceDistribution(NameVersion nameVersion, + Resource resource) { + this(nameVersion.getName(), nameVersion.getVersion(), resource); + } + public VersionedResourceDistribution(String name, String version, Resource resource) { super(resource); diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/msg/build/ModularDistributionDescriptor.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/msg/build/ModularDistributionDescriptor.java new file mode 100644 index 000000000..1115149a0 --- /dev/null +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/msg/build/ModularDistributionDescriptor.java @@ -0,0 +1,24 @@ +package org.argeo.slc.msg.build; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import org.argeo.slc.build.BasicNameVersion; + +public class ModularDistributionDescriptor extends BasicNameVersion implements + Serializable { + private static final long serialVersionUID = 1L; + + /** key is type, value the URL */ + private Map modulesDescriptors = new HashMap(); + + public Map getModulesDescriptors() { + return modulesDescriptors; + } + + public void setModulesDescriptors(Map urls) { + this.modulesDescriptors = urls; + } + +} diff --git a/runtime/org.argeo.slc.osgiboot/src/main/java/org/argeo/slc/osgiboot/OsgiBoot.java b/runtime/org.argeo.slc.osgiboot/src/main/java/org/argeo/slc/osgiboot/OsgiBoot.java index fcefc8345..788c0babf 100644 --- a/runtime/org.argeo.slc.osgiboot/src/main/java/org/argeo/slc/osgiboot/OsgiBoot.java +++ b/runtime/org.argeo.slc.osgiboot/src/main/java/org/argeo/slc/osgiboot/OsgiBoot.java @@ -37,7 +37,7 @@ public class OsgiBoot { .booleanValue(); private boolean excludeSvn = true; - private String modulesUrlSeparator = ";"; + private String modulesUrlSeparator = ","; private final BundleContext bundleContext; diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AbstractAvailableModules.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AbstractAvailableModules.java index e9acf08f2..f85f4d86c 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AbstractAvailableModules.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AbstractAvailableModules.java @@ -8,8 +8,11 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.argeo.slc.build.ModularDistribution; +import org.argeo.slc.build.NameVersion; import org.springframework.web.HttpRequestHandler; +import common.BaseUnit; + /** List of modules for a distribution. */ public abstract class AbstractAvailableModules implements HttpRequestHandler { protected abstract void print(Writer out, String baseUrl, @@ -23,8 +26,9 @@ public abstract class AbstractAvailableModules implements HttpRequestHandler { .getAttribute("modularDistribution"); String baseUrl = "http://" + request.getServerName() + ":" - + request.getServerPort() + request.getContextPath() + "/" - + md.getName() + "/" + md.getVersion() + "/"; + + request.getServerPort() + request.getContextPath() + + request.getServletPath() + "/" + md.getName() + "/" + + md.getVersion() + "/"; print(response.getWriter(), baseUrl, md); } @@ -33,4 +37,12 @@ public abstract class AbstractAvailableModules implements HttpRequestHandler { return "text/plain"; } + protected String jarUrl(String baseUrl, NameVersion nameVersion) { + return baseUrl + jarFileName(nameVersion); + } + + protected String jarFileName(NameVersion nameVersion) { + return nameVersion.getName() + "-" + nameVersion.getVersion() + ".jar"; + } + } diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AvailableModulesHtml.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AvailableModulesHtml.java index 338de8353..7a860996d 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AvailableModulesHtml.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AvailableModulesHtml.java @@ -3,8 +3,10 @@ package org.argeo.slc.web.mvc.provisioning; import java.io.IOException; import java.io.Writer; +import org.argeo.slc.build.Distribution; import org.argeo.slc.build.ModularDistribution; import org.argeo.slc.build.NameVersion; +import org.argeo.slc.core.build.ResourceDistribution; /** List of modules for a distribution. */ public class AvailableModulesHtml extends AbstractAvailableModules { @@ -14,12 +16,22 @@ public class AvailableModulesHtml extends AbstractAvailableModules { out.write("

Distribution " + md + "

"); for (NameVersion nameVersion : md.listModulesNameVersions()) { - String fileName = nameVersion.getName() + "-" - + nameVersion.getVersion() + ".jar"; - String moduleUrl = baseUrl + fileName; - out - .write("" + fileName - + "
"); + Distribution distribution = md.getModuleDistribution(nameVersion + .getName(), nameVersion.getVersion()); + + String moduleUrl = null; + if (distribution instanceof ResourceDistribution) { + String url = ((ResourceDistribution) distribution) + .getLocation().getURL().toString(); + if (url.startsWith("reference:")) + moduleUrl = url; + } + + if (moduleUrl == null) + moduleUrl = jarUrl(baseUrl, nameVersion); + + out.write("" + + jarFileName(nameVersion) + "
"); } } diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AvailableModulesOsgiBoot.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AvailableModulesOsgiBoot.java index a31dae9cc..d0a76e979 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AvailableModulesOsgiBoot.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/AvailableModulesOsgiBoot.java @@ -8,7 +8,7 @@ import org.argeo.slc.build.NameVersion; /** List of modules for a distribution. */ public class AvailableModulesOsgiBoot extends AbstractAvailableModules { - private String separator = ";"; + private String separator = ","; @Override protected void print(Writer out, String baseUrl, ModularDistribution md) 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 index d4c7260a9..073724d06 100644 --- 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 @@ -17,6 +17,6 @@ public class EclipseUpdateSiteHandler implements HttpRequestHandler { ModularDistribution modularDistribution = (ModularDistribution) request .getAttribute("modularDistribution"); response.getWriter().write( - modularDistribution.getDescriptor("eclipse").toString()); + modularDistribution.getModulesDescriptor("eclipse").toString()); } } diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/ListModularDistributions.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/ListModularDistributions.java new file mode 100644 index 000000000..13261dd7d --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/provisioning/ListModularDistributions.java @@ -0,0 +1,54 @@ +package org.argeo.slc.web.mvc.provisioning; + +import java.util.Iterator; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.slc.build.ModularDistribution; +import org.argeo.slc.msg.ObjectList; +import org.argeo.slc.msg.build.ModularDistributionDescriptor; +import org.argeo.slc.web.mvc.AbstractServiceController; +import org.springframework.web.servlet.ModelAndView; + +/** List of distributions. */ +public class ListModularDistributions extends AbstractServiceController { + private Set modularDistributions; + + @Override + protected void handleServiceRequest(HttpServletRequest request, + HttpServletResponse response, ModelAndView modelAndView) + throws Exception { + + String baseUrl = "http://" + request.getServerName() + ":" + + request.getServerPort() + request.getContextPath() + "/dist" + + "/"; + + ObjectList ol = new ObjectList(); + + for (Iterator it = modularDistributions.iterator(); it + .hasNext();) { + ModularDistribution md = it.next(); + String moduleBase = baseUrl + md.getName() + "/" + md.getVersion() + + "/"; + ModularDistributionDescriptor mdd = new ModularDistributionDescriptor(); + mdd.setName(md.getName()); + mdd.setVersion(md.getVersion()); + + mdd.getModulesDescriptors().put("modularDistribution", + moduleBase + "modularDistribution"); + mdd.getModulesDescriptors().put("eclipse", moduleBase + "site.xml"); + + ol.getObjects().add(mdd); + } + + modelAndView.addObject(ol); + } + + public void setModularDistributions( + Set modularDistributions) { + this.modularDistributions = modularDistributions; + } + +} diff --git a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/build/ModularDistribution.java b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/build/ModularDistribution.java index cc9aacdc0..5c9f43778 100644 --- a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/build/ModularDistribution.java +++ b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/build/ModularDistribution.java @@ -8,5 +8,5 @@ public interface ModularDistribution extends Distribution, NameVersion { public Set listModulesNameVersions(); - public Object getDescriptor(String descriptorType); + public Object getModulesDescriptor(String descriptorType); } diff --git a/runtime/org.argeo.slc.support.castor/pom.xml b/runtime/org.argeo.slc.support.castor/pom.xml index 41c1b6f5f..4035da589 100644 --- a/runtime/org.argeo.slc.support.castor/pom.xml +++ b/runtime/org.argeo.slc.support.castor/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 org.argeo.slc @@ -38,6 +39,7 @@ org.argeo.slc.* org.argeo.slc.*;resolution:=optional, + org.argeo.slc.build;resolution:=optional, org.argeo.slc.execution;resolution:=optional, org.argeo.slc.core.attachment;resolution:=optional, org.argeo.slc.core.structure;resolution:=optional, @@ -47,6 +49,7 @@ org.argeo.slc.runtime;resolution:=optional, org.argeo.slc.core.execution;resolution:=optional, org.argeo.slc.msg;resolution:=optional, + org.argeo.slc.msg.build;resolution:=optional, org.argeo.slc.msg.process;resolution:=optional, org.argeo.slc.msg.event;resolution:=optional, org.argeo.slc.msg.test.tree;resolution:=optional, @@ -91,7 +94,7 @@ javax.xml.stream com.springsource.javax.xml.stream
- + org.argeo.slc.runtime diff --git a/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/build.xml b/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/build.xml new file mode 100644 index 000000000..60e66c0ec --- /dev/null +++ b/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/build.xml @@ -0,0 +1,16 @@ + + + + Build objects XML mapping + + + + + + + + + + + \ No newline at end of file diff --git a/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/msg.xml b/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/msg.xml index 0712515c8..85f5d850d 100644 --- a/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/msg.xml +++ b/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/msg.xml @@ -29,6 +29,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/spring.xml b/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/spring.xml index bdcd63a64..6b0fa2b42 100644 --- a/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/spring.xml +++ b/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/spring.xml @@ -27,6 +27,9 @@ classpath:org/argeo/slc/castor/attachment.xml + + classpath:org/argeo/slc/castor/build.xml + diff --git a/runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/AbstractCastorTestCase.java b/runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/AbstractCastorTestCase.java index a2f48c199..1cdd7be8f 100644 --- a/runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/AbstractCastorTestCase.java +++ b/runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/AbstractCastorTestCase.java @@ -35,7 +35,7 @@ public abstract class AbstractCastorTestCase extends AbstractSpringTestCase { StringResult xml = new StringResult(); marshaller.marshal(obj, xml); - log.info("Marshalled ResultPart Request: " + xml); + log.info("Marshalled " + obj.getClass() + ": " + xml + "\n"); if (validate) UnitXmlUtils.assertXmlValidation(getBean(XmlValidator.class), diff --git a/runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/ModularDistributionCastorTest.java b/runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/ModularDistributionCastorTest.java new file mode 100644 index 000000000..e2e2209d9 --- /dev/null +++ b/runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/ModularDistributionCastorTest.java @@ -0,0 +1,43 @@ +package org.argeo.slc.castor; + +import org.argeo.slc.msg.ObjectList; +import org.argeo.slc.msg.build.ModularDistributionDescriptor; + +public class ModularDistributionCastorTest extends AbstractCastorTestCase { + public void testModularDistributionDescriptor() throws Exception { + ModularDistributionDescriptor mdd = new ModularDistributionDescriptor(); + mdd.setName("name"); + mdd.setVersion("0.1.0"); + mdd.getModulesDescriptors().put("eclipse", + "http://localhost/updateSite"); + mdd.getModulesDescriptors().put("modularDistribution", + "http://localhost/modularDistribution"); + + marshUnmarsh(mdd, false); + } + + public void testModularDistributionDescriptorList() throws Exception { + ModularDistributionDescriptor mdd = new ModularDistributionDescriptor(); + mdd.setName("name"); + mdd.setVersion("0.1.0"); + mdd.getModulesDescriptors().put("eclipse", + "http://localhost/updateSite"); + mdd.getModulesDescriptors().put("modularDistribution", + "http://localhost/modularDistribution"); + + ModularDistributionDescriptor mdd2 = new ModularDistributionDescriptor(); + mdd2.setName("name2"); + mdd2.setVersion("0.1.1"); + mdd2.getModulesDescriptors().put("eclipse", + "http://localhost/updateSite2"); + mdd2.getModulesDescriptors().put("modularDistribution", + "http://localhost/modularDistribution2"); + + ObjectList ol = new ObjectList(); + ol.getObjects().add(mdd); + ol.getObjects().add(mdd2); + + marshUnmarsh(ol, false); + } + +} diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiBundle.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiBundle.java index 745ba76a6..6dd75716a 100644 --- a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiBundle.java +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiBundle.java @@ -1,5 +1,6 @@ package org.argeo.slc.osgi; +import org.argeo.slc.build.BasicNameVersion; import org.argeo.slc.build.Distribution; import org.argeo.slc.deploy.DeploymentData; import org.argeo.slc.deploy.Module; @@ -8,9 +9,7 @@ import org.argeo.slc.process.RealizedFlow; import org.osgi.framework.Bundle; import org.osgi.framework.Constants; -public class OsgiBundle implements Module { - private String name; - private String version; +public class OsgiBundle extends BasicNameVersion implements Module { private Distribution distribution; private Long internalBundleId; @@ -20,23 +19,28 @@ public class OsgiBundle implements Module { } public OsgiBundle(String name, String version) { - this.name = name; - this.version = version; + super(name, version); } public OsgiBundle(Bundle bundle) { - name = bundle.getSymbolicName(); - version = bundle.getHeaders().get(Constants.BUNDLE_VERSION).toString(); + super(bundle.getSymbolicName(), getVersionSafe(bundle)); internalBundleId = bundle.getBundleId(); } + private static String getVersionSafe(Bundle bundle) { + Object versionObj = bundle.getHeaders().get(Constants.BUNDLE_VERSION); + if (versionObj != null) + return versionObj.toString(); + else + return null; + } + public OsgiBundle(RealizedFlow realizedFlow) { - name = realizedFlow.getModuleName(); - version = realizedFlow.getModuleVersion(); + super(realizedFlow.getModuleName(), realizedFlow.getModuleVersion()); } public String getDeployedSystemId() { - return name + ":" + version; + return getName() + ":" + getVersion(); } public DeploymentData getDeploymentData() { @@ -51,22 +55,6 @@ public class OsgiBundle implements Module { throw new UnsupportedOperationException(); } - public String getName() { - return name; - } - - public String getVersion() { - return version; - } - - public void setName(String name) { - this.name = name; - } - - public void setVersion(String version) { - this.version = version; - } - public void setDistribution(Distribution distribution) { this.distribution = distribution; } diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/AbstractOsgiModularDistribution.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/AbstractOsgiModularDistribution.java new file mode 100644 index 000000000..d4df34463 --- /dev/null +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/AbstractOsgiModularDistribution.java @@ -0,0 +1,157 @@ +package org.argeo.slc.osgi.build; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; +import org.argeo.slc.UnsupportedException; +import org.argeo.slc.build.BasicNameVersion; +import org.argeo.slc.build.Distribution; +import org.argeo.slc.build.ModularDistribution; +import org.argeo.slc.build.NameVersion; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.osgi.context.BundleContextAware; + +public abstract class AbstractOsgiModularDistribution implements + ModularDistribution, BundleContextAware, InitializingBean { + private final static Log log = LogFactory + .getLog(AbstractOsgiModularDistribution.class); + + private BundleContext bundleContext; + private EclipseUpdateSite eclipseUpdateSite; + + /** Initialized by the object itself. */ + private SortedMap distributions = new TreeMap(); + + protected abstract void fillDistributions( + SortedMap distributions) + throws Exception; + + public Distribution getModuleDistribution(String moduleName, + String moduleVersion) { + return distributions + .get(new BasicNameVersion(moduleName, moduleVersion)); + } + + public String getDistributionId() { + return bundleContext.getBundle().getSymbolicName() + + "-" + + bundleContext.getBundle().getHeaders().get( + Constants.BUNDLE_VERSION); + } + + public Set listModulesNameVersions() { + return distributions.keySet(); + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + public void afterPropertiesSet() throws Exception { + fillDistributions(distributions); + if (log.isDebugEnabled()) + log.debug("Distribution " + getName() + ":" + getVersion() + + " loaded (" + distributions.size() + " modules)"); + } + + protected String findVersion(String name) { + Set versions = new HashSet(); + for (NameVersion key : distributions.keySet()) { + if (key.getName().equals(name)) + versions.add(key.getVersion()); + } + + if (versions.size() == 0) + throw new SlcException("Cannot find version for name " + name); + else if (versions.size() > 1) + throw new SlcException("Found more than one version for name " + + name + ": " + versions); + else + return versions.iterator().next(); + + } + + public Object getModulesDescriptor(String descriptorType) { + if (descriptorType.equals("eclipse")) + return writeEclipseUpdateSite(); + else + throw new UnsupportedException("descriptorType", descriptorType); + } + + protected Set writePlainUrlList() { + return distributions.keySet(); + } + + protected String writeEclipseUpdateSite() { + if (eclipseUpdateSite == null) + throw new SlcException("No eclipse update site declared."); + + StringBuffer buf = new StringBuffer(""); + buf.append(""); + + List usedCategories = new ArrayList(); + for (EclipseUpdateSiteFeature feature : eclipseUpdateSite.getFeatures()) { + + String featureId = feature.getName(); + String featureVersion = findVersion(featureId); + 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(""); + return buf.toString(); + } + + public String getName() { + return bundleContext.getBundle().getSymbolicName(); + } + + public String getVersion() { + return bundleContext.getBundle().getHeaders().get( + Constants.BUNDLE_VERSION).toString(); + } + + @Override + public String toString() { + return new BasicNameVersion(this).toString(); + } + + public void setEclipseUpdateSite(EclipseUpdateSite eclipseUpdateSite) { + this.eclipseUpdateSite = eclipseUpdateSite; + } + + public BundleContext getBundleContext() { + return bundleContext; + } + +} diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/BundleModularDistribution.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/BundleModularDistribution.java index 79bc3e6a8..ac6eaa75e 100644 --- a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/BundleModularDistribution.java +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/BundleModularDistribution.java @@ -1,92 +1,33 @@ package org.argeo.slc.osgi.build; import java.net.URL; -import java.util.ArrayList; import java.util.Enumeration; -import java.util.HashSet; -import java.util.List; -import java.util.Set; import java.util.SortedMap; import java.util.StringTokenizer; -import java.util.TreeMap; import java.util.jar.JarInputStream; import java.util.jar.Manifest; 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.argeo.slc.UnsupportedException; import org.argeo.slc.build.BasicNameVersion; import org.argeo.slc.build.Distribution; -import org.argeo.slc.build.ModularDistribution; import org.argeo.slc.build.NameVersion; import org.argeo.slc.core.build.VersionedResourceDistribution; -import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; -import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.ResourceLoader; -import org.springframework.osgi.context.BundleContextAware; -public class BundleModularDistribution implements ModularDistribution, - BundleContextAware, InitializingBean, ResourceLoaderAware { - private final static Log log = LogFactory - .getLog(BundleModularDistribution.class); - - private BundleContext bundleContext; +public class BundleModularDistribution extends AbstractOsgiModularDistribution + implements ResourceLoaderAware { private ResourceLoader resourceLoader; private String libDirectory = "/lib"; - private EclipseUpdateSite eclipseUpdateSite; - - /** Initialized by the object itself. */ - private SortedMap distributions = new TreeMap(); - - public Distribution getModuleDistribution(String moduleName, - String moduleVersion) { - return distributions - .get(new BasicNameVersion(moduleName, moduleVersion)); - // URL url = findModule(moduleName, moduleVersion); - // return new ResourceDistribution(new UrlResource(url)); - } @SuppressWarnings(value = { "unchecked" }) - protected URL findModule(String moduleName, String version) { - Enumeration urls = (Enumeration) bundleContext.getBundle() - .findEntries(libDirectory, moduleName + "*", false); - - if (!urls.hasMoreElements()) - throw new SlcException("Cannot find module " + moduleName); - - URL url = urls.nextElement(); - - // TODO: check version as well - if (urls.hasMoreElements()) - throw new SlcException("More than one module with name " - + moduleName); - return url; - } - - public String getDistributionId() { - return bundleContext.getBundle().getSymbolicName() - + "-" - + bundleContext.getBundle().getHeaders().get( - Constants.BUNDLE_VERSION); - } - - public Set listModulesNameVersions() { - return distributions.keySet(); - } - - public void setBundleContext(BundleContext bundleContext) { - this.bundleContext = bundleContext; - } - - @SuppressWarnings(value = { "unchecked" }) - public void afterPropertiesSet() throws Exception { - Enumeration urls = (Enumeration) bundleContext.getBundle() - .findEntries(libDirectory, "*.jar", false); + protected void fillDistributions( + SortedMap distributions) + throws Exception { + Enumeration urls = (Enumeration) getBundleContext() + .getBundle().findEntries(libDirectory, "*.jar", false); while (urls.hasMoreElements()) { URL url = urls.nextElement(); JarInputStream in = null; @@ -112,105 +53,30 @@ public class BundleModularDistribution implements ModularDistribution, IOUtils.closeQuietly(in); } } - if (log.isDebugEnabled()) - log.debug("Distribution " + getName() + ":" + getVersion() - + " loaded (" + distributions.size() + " modules)"); - - } - - protected String findVersion(String name) { - Set versions = new HashSet(); - for (NameVersion key : distributions.keySet()) { - if (key.getName().equals(name)) - versions.add(key.getVersion()); - } - - if (versions.size() == 0) - throw new SlcException("Cannot find version for name " + name); - else if (versions.size() > 1) - throw new SlcException("Found more than one version for name " - + name + ": " + versions); - else - return versions.iterator().next(); - } public void setLibDirectory(String libDirectory) { this.libDirectory = libDirectory; } - public Object getDescriptor(String descriptorType) { - if (descriptorType.equals("eclipse")) - return writeEclipseUpdateSite(); - else - throw new UnsupportedException("descriptorType", descriptorType); - } - - protected Set writePlainUrlList() { - return distributions.keySet(); - } - - protected String writeEclipseUpdateSite() { - if (eclipseUpdateSite == null) - throw new SlcException("No eclipse update site declared."); - - StringBuffer buf = new StringBuffer(""); - buf.append(""); - - List usedCategories = new ArrayList(); - for (EclipseUpdateSiteFeature feature : eclipseUpdateSite.getFeatures()) { - - String featureId = feature.getName(); - String featureVersion = findVersion(featureId); - 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(""); - return buf.toString(); - } - public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } - public String getName() { - return bundleContext.getBundle().getSymbolicName(); - } - - public String getVersion() { - return bundleContext.getBundle().getHeaders().get( - Constants.BUNDLE_VERSION).toString(); - } - - @Override - public String toString() { - return new BasicNameVersion(this).toString(); - } - - public void setEclipseUpdateSite(EclipseUpdateSite eclipseUpdateSite) { - this.eclipseUpdateSite = eclipseUpdateSite; - } + /* + * @SuppressWarnings(value = { "unchecked" }) protected URL + * findModule(String moduleName, String version) { Enumeration urls = + * (Enumeration) bundleContext.getBundle() .findEntries(libDirectory, + * moduleName + "*", false); + * + * if (!urls.hasMoreElements()) throw new SlcException("Cannot find module " + * + moduleName); + * + * URL url = urls.nextElement(); + * + * // TODO: check version as well if (urls.hasMoreElements()) throw new + * SlcException("More than one module with name " + moduleName); return url; + * } + */ } diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/OsgiRuntimeModularDistribution.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/OsgiRuntimeModularDistribution.java new file mode 100644 index 000000000..1c68cf5c3 --- /dev/null +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/build/OsgiRuntimeModularDistribution.java @@ -0,0 +1,49 @@ +package org.argeo.slc.osgi.build; + +import java.net.URL; +import java.util.SortedMap; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.build.Distribution; +import org.argeo.slc.build.NameVersion; +import org.argeo.slc.core.build.VersionedResourceDistribution; +import org.argeo.slc.osgi.OsgiBundle; +import org.osgi.framework.Bundle; +import org.springframework.context.ResourceLoaderAware; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; + +public class OsgiRuntimeModularDistribution extends + AbstractOsgiModularDistribution implements ResourceLoaderAware { + private final static Log log = LogFactory + .getLog(OsgiRuntimeModularDistribution.class); + + private ResourceLoader resourceLoader; + + protected void fillDistributions( + SortedMap distributions) + throws Exception { + + for (Bundle bundle : getBundleContext().getBundles()) { + OsgiBundle osgiBundle = new OsgiBundle(bundle); + + String location = bundle.getLocation(); + if (location.startsWith("reference:file:")) + location = location.substring("reference:".length()); + try { + URL url = new URL(location); + Resource res = resourceLoader.getResource(url.toString()); + distributions.put(osgiBundle, + new VersionedResourceDistribution(osgiBundle, res)); + } catch (Exception e) { + log.warn("Cannot interpret location " + location + + " of bundle " + bundle + ": " + e); + } + } + } + + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } +} -- 2.39.2