From 5a7871454f57064cf5fb2be810dc1f26f744629e Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 23 Jul 2009 15:52:29 +0000 Subject: [PATCH] Upload of distributions git-svn-id: https://svn.argeo.org/slc/trunk@2738 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/pom.xml | 1 - .../org.argeo.slc.demo.log4j/log4j.properties | 5 +- .../META-INF/MANIFEST.MF | 4 +- .../META-INF/MANIFEST.MF | 6 +- .../WEB-INF/slc-service-servlet.xml | 7 ++ .../slc/core/build/ResourceDistribution.java | 21 +++-- runtime/org.argeo.slc.server/pom.xml | 6 ++ .../org/argeo/slc/web/mvc/FileUploadBean.java | 14 ++++ .../slc/web/mvc/management/InstallModule.java | 81 +++++++++++++++++++ .../web/mvc/management/UninstallModule.java | 30 +++++++ .../provisioning/AvailableModulesHtml.java | 2 +- .../org/argeo/slc/deploy/DynamicRuntime.java | 9 +++ .../org/argeo/slc/equinox/EquinoxRuntime.java | 5 +- .../java/org/argeo/slc/osgi/OsgiBundle.java | 9 ++- .../java/org/argeo/slc/osgi/OsgiRuntime.java | 62 +++++++++++++- 15 files changed, 236 insertions(+), 26 deletions(-) create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/FileUploadBean.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/InstallModule.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/UninstallModule.java diff --git a/demo/pom.xml b/demo/pom.xml index 9f0a494c9..4b6cc0715 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -99,7 +99,6 @@ org.argeo.slc.ria - ${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/agent;in=*;ex=pom.xml;ex=target diff --git a/demo/site/org.argeo.slc.demo.log4j/log4j.properties b/demo/site/org.argeo.slc.demo.log4j/log4j.properties index 875e36cef..7da0cc4c8 100644 --- a/demo/site/org.argeo.slc.demo.log4j/log4j.properties +++ b/demo/site/org.argeo.slc.demo.log4j/log4j.properties @@ -12,8 +12,9 @@ log4j.logger.org.argeo.slc.execution.SimpleExecutionSpec=DEBUG log4j.logger.org.hibernate=WARN log4j.logger.org.springframework=WARN -log4j.logger.org.springframework.jms=WARN -log4j.logger.org.springframework.security=WARN +#log4j.logger.org.springframework.web=DEBUG +#log4j.logger.org.springframework.jms=WARN +#log4j.logger.org.springframework.security=WARN log4j.logger.org.apache.activemq=WARN log4j.logger.org.apache.activemq.transport=WARN diff --git a/modules/server/org.argeo.slc.server.catalina/META-INF/MANIFEST.MF b/modules/server/org.argeo.slc.server.catalina/META-INF/MANIFEST.MF index 35de2e24b..ad5203f46 100644 --- a/modules/server/org.argeo.slc.server.catalina/META-INF/MANIFEST.MF +++ b/modules/server/org.argeo.slc.server.catalina/META-INF/MANIFEST.MF @@ -3,4 +3,6 @@ Fragment-Host: com.springsource.org.apache.catalina;bundle-version="[6 .0.16,7.0.0)" Bundle-Version: 0.11.4.SNAPSHOT Bundle-SymbolicName: org.argeo.slc.server.catalina - +Import-Package: org.springframework.security.providers, + org.springframework.security, + org.springframework.security.ui 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 834a4474a..594661455 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 @@ -38,6 +38,8 @@ Import-Package: net.sf.cglib.core, org.springframework.orm.hibernate3.support, org.springframework.osgi.web.context.support, org.springframework.oxm, + org.springframework.security.context, + org.springframework.security.providers, org.springframework.security.ui.webapp, org.springframework.security.userdetails.memory, org.springframework.transaction, @@ -47,6 +49,4 @@ Import-Package: net.sf.cglib.core, org.springframework.web.filter, org.springframework.web.servlet, org.springframework.web.servlet.handler, - org.springframework.web.servlet.mvc, - org.springframework.security.context, - org.springframework.security.providers + org.springframework.web.servlet.mvc 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 42f0ec533..5ea3a7674 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 @@ -109,6 +109,13 @@ + + + + + + + org.springframework.oxm + + + org.apache.commons + com.springsource.org.apache.commons.fileupload + + javax.servlet diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/FileUploadBean.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/FileUploadBean.java new file mode 100644 index 000000000..4c064961b --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/FileUploadBean.java @@ -0,0 +1,14 @@ +package org.argeo.slc.web.mvc; + + +public class FileUploadBean { + private byte[] file; + + public void setFile(byte[] file) { + this.file = file; + } + + public byte[] getFile() { + return file; + } +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/InstallModule.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/InstallModule.java new file mode 100644 index 000000000..6b61fd9d8 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/InstallModule.java @@ -0,0 +1,81 @@ +package org.argeo.slc.web.mvc.management; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.argeo.slc.core.build.ResourceDistribution; +import org.argeo.slc.deploy.DynamicRuntime; +import org.argeo.slc.deploy.Module; +import org.argeo.slc.web.mvc.AbstractServiceController; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.web.servlet.ModelAndView; + +public class InstallModule extends AbstractServiceController {// extends + private DynamicRuntime dynamicRuntime; + + // Create a factory for disk-based file items + private FileItemFactory factory = new DiskFileItemFactory(); + + // Create a new file upload handler + private ServletFileUpload upload = new ServletFileUpload(factory); + + @Override + @SuppressWarnings(value = { "unchecked" }) + protected void handleServiceRequest(HttpServletRequest request, + HttpServletResponse response, ModelAndView modelAndView) + throws Exception { + // Parse the request + List items = upload.parseRequest(request); + + byte[] arr = null; + for (FileItem item : items) { + if (!item.isFormField()) { + arr = item.get(); + break; + } + } + + ByteArrayResource res = new ByteArrayResource(arr); + Module module = dynamicRuntime.installModule(new ResourceDistribution( + res)); + + // TODO: customize whether the module is started or not + dynamicRuntime.startModule(module); + } + + // protected ModelAndView onSubmit(HttpServletRequest request, + // HttpServletResponse response, Object command, BindException errors) + // throws Exception { + // FileUploadBean bean = (FileUploadBean) command; + // + // byte[] file = bean.getFile(); + // if (file == null) { + // throw new SlcException("Upload is empty."); + // } + // + // ByteArrayResource res = new ByteArrayResource(file); + // dynamicRuntime.installModule(new ResourceDistribution(res)); + // + // return super.onSubmit(request, response, command, errors); + // } + // + // protected void initBinder(HttpServletRequest request, + // ServletRequestDataBinder binder) throws ServletException { + // // to actually be able to convert Multipart instance to byte[] + // // we have to register a custom editor + // binder.registerCustomEditor(byte[].class, + // new ByteArrayMultipartFileEditor()); + // // now Spring knows how to handle multipart object and convert them + // } + + public void setDynamicRuntime(DynamicRuntime dynamicRuntime) { + this.dynamicRuntime = dynamicRuntime; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/UninstallModule.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/UninstallModule.java new file mode 100644 index 000000000..94c61b03f --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/UninstallModule.java @@ -0,0 +1,30 @@ +package org.argeo.slc.web.mvc.management; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.slc.build.BasicNameVersion; +import org.argeo.slc.build.NameVersion; +import org.argeo.slc.deploy.DynamicRuntime; +import org.argeo.slc.web.mvc.AbstractServiceController; +import org.springframework.web.servlet.ModelAndView; + +/** . */ +public class UninstallModule extends AbstractServiceController { + private DynamicRuntime dynamicRuntime; + + @Override + protected void handleServiceRequest(HttpServletRequest request, + HttpServletResponse response, ModelAndView modelAndView) + throws Exception { + String name = request.getParameter("name"); + String version = request.getParameter("version"); + NameVersion nameVersion = new BasicNameVersion(name, version); + dynamicRuntime.uninstallModule(nameVersion); + } + + public void setDynamicRuntime(DynamicRuntime dynamicRuntime) { + this.dynamicRuntime = dynamicRuntime; + } + +} 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 7a860996d..ca6434c4c 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 @@ -22,7 +22,7 @@ public class AvailableModulesHtml extends AbstractAvailableModules { String moduleUrl = null; if (distribution instanceof ResourceDistribution) { String url = ((ResourceDistribution) distribution) - .getLocation().getURL().toString(); + .getResource().getURL().toString(); if (url.startsWith("reference:")) moduleUrl = url; } diff --git a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/deploy/DynamicRuntime.java b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/deploy/DynamicRuntime.java index e2552732a..0984b252f 100644 --- a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/deploy/DynamicRuntime.java +++ b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/deploy/DynamicRuntime.java @@ -1,7 +1,16 @@ package org.argeo.slc.deploy; +import org.argeo.slc.build.Distribution; +import org.argeo.slc.build.NameVersion; + public interface DynamicRuntime extends ModularDeployedSystem { public void shutdown(); + public M installModule(Distribution distribution); + + public void uninstallModule(NameVersion nameVersion); + + public void startModule(NameVersion nameVersion); + } diff --git a/runtime/org.argeo.slc.support.equinox/src/main/java/org/argeo/slc/equinox/EquinoxRuntime.java b/runtime/org.argeo.slc.support.equinox/src/main/java/org/argeo/slc/equinox/EquinoxRuntime.java index 60d36280c..45bbe234d 100644 --- a/runtime/org.argeo.slc.support.equinox/src/main/java/org/argeo/slc/equinox/EquinoxRuntime.java +++ b/runtime/org.argeo.slc.support.equinox/src/main/java/org/argeo/slc/equinox/EquinoxRuntime.java @@ -1,13 +1,10 @@ package org.argeo.slc.equinox; import org.argeo.slc.SlcException; -import org.argeo.slc.deploy.DynamicRuntime; -import org.argeo.slc.osgi.OsgiBundle; import org.argeo.slc.osgi.OsgiRuntime; import org.eclipse.core.runtime.adaptor.EclipseStarter; -public class EquinoxRuntime extends OsgiRuntime implements - DynamicRuntime { +public class EquinoxRuntime extends OsgiRuntime { public void shutdown() { try { 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 6dd75716a..9fb09bebf 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 @@ -2,6 +2,7 @@ package org.argeo.slc.osgi; import org.argeo.slc.build.BasicNameVersion; import org.argeo.slc.build.Distribution; +import org.argeo.slc.core.build.ResourceDistribution; import org.argeo.slc.deploy.DeploymentData; import org.argeo.slc.deploy.Module; import org.argeo.slc.deploy.TargetData; @@ -10,7 +11,7 @@ import org.osgi.framework.Bundle; import org.osgi.framework.Constants; public class OsgiBundle extends BasicNameVersion implements Module { - private Distribution distribution; + private ResourceDistribution distribution; private Long internalBundleId; @@ -51,11 +52,15 @@ public class OsgiBundle extends BasicNameVersion implements Module { return distribution; } + public ResourceDistribution getResourceDistribution() { + return distribution; + } + public TargetData getTargetData() { throw new UnsupportedOperationException(); } - public void setDistribution(Distribution distribution) { + public void setResourceDistribution(ResourceDistribution distribution) { this.distribution = distribution; } diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiRuntime.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiRuntime.java index e433d7e29..504f0cfa9 100644 --- a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiRuntime.java +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiRuntime.java @@ -4,21 +4,25 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.argeo.slc.SlcException; +import org.argeo.slc.StreamReadable; import org.argeo.slc.UnsupportedException; import org.argeo.slc.build.Distribution; +import org.argeo.slc.build.NameVersion; import org.argeo.slc.core.build.VersionedResourceDistribution; import org.argeo.slc.deploy.DeploymentData; -import org.argeo.slc.deploy.ModularDeployedSystem; +import org.argeo.slc.deploy.DynamicRuntime; import org.argeo.slc.deploy.TargetData; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleException; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.osgi.context.BundleContextAware; -public class OsgiRuntime implements ModularDeployedSystem, - BundleContextAware, ResourceLoaderAware { +public class OsgiRuntime implements BundleContextAware, ResourceLoaderAware, + DynamicRuntime { private String uuid = UUID.randomUUID().toString(); private BundleContext bundleContext; private ResourceLoader resourceLoader; @@ -33,7 +37,7 @@ public class OsgiRuntime implements ModularDeployedSystem, if (location != null) { Resource resource = resourceLoader.getResource(location); osgiBundle - .setDistribution(new VersionedResourceDistribution( + .setResourceDistribution(new VersionedResourceDistribution( osgiBundle.getName(), osgiBundle.getVersion(), resource)); } @@ -41,6 +45,56 @@ public class OsgiRuntime implements ModularDeployedSystem, return modules; } + public OsgiBundle installModule(Distribution distribution) { + if (!(distribution instanceof StreamReadable)) + throw new UnsupportedException("distribution", distribution); + + StreamReadable sr = (StreamReadable) distribution; + Bundle bundle; + try { + bundle = bundleContext.installBundle(sr.toString(), sr + .getInputStream()); + } catch (BundleException e) { + throw new SlcException( + "Cannot install OSGi bundle " + distribution, e); + } + return new OsgiBundle(bundle); + } + + public void uninstallModule(NameVersion nameVersion) { + Bundle bundle = findBundle(nameVersion); + try { + bundle.uninstall(); + } catch (BundleException e) { + throw new SlcException("Cannot uninstall " + bundle, e); + } + } + + public void startModule(NameVersion nameVersion) { + Bundle bundle = findBundle(nameVersion); + try { + bundle.start(); + // TODO: use bundle manager + } catch (BundleException e) { + throw new SlcException("Cannot uninstall " + bundle, e); + } + } + + protected Bundle findBundle(NameVersion nameVersion) { + Bundle[] bundles = bundleContext.getBundles(); + for (Bundle bundle : bundles) { + OsgiBundle osgiBundle = new OsgiBundle(bundle); + if (osgiBundle.equals(nameVersion)) { + return bundle; + } + } + throw new SlcException("Could not find bundle " + nameVersion); + } + + public void shutdown() { + throw new UnsupportedException(); + } + public String getDeployedSystemId() { return uuid; } -- 2.39.2