Author: ffang
Date: Fri Feb 6 10:13:30 2009
New Revision: 741500
URL: http://svn.apache.org/viewvc?rev=741500&view=rev
Log:
[SMX4NMR-17]get MBeans working for
listComponent/installSharedLib/uninstallSharedLib/listSharedLib
Added:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AbstractInstaller.java
(with props)
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ComponentInstaller.java
- copied, changed from r741389,
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/Installer.java
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/SharedLibInstaller.java
(with props)
Removed:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/Installer.java
Modified:
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsService.java
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsServiceMBean.java
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminService.java
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/InstallationService.java
Modified:
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java?rev=741500&r1=741499&r2=741500&view=diff
==============================================================================
---
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java
(original)
+++
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java
Fri Feb 6 10:13:30 2009
@@ -38,6 +38,7 @@
import org.apache.servicemix.jbi.deployer.Component;
import org.apache.servicemix.jbi.deployer.ServiceUnit;
import org.apache.servicemix.jbi.deployer.descriptor.ComponentDesc;
+import org.apache.servicemix.jbi.deployer.descriptor.SharedLibraryList;
import org.apache.servicemix.jbi.runtime.ComponentWrapper;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
@@ -124,13 +125,17 @@
stop(true);
}
- protected Set<ServiceAssemblyImpl> getServiceAssemblies() {
+ public Set<ServiceAssemblyImpl> getServiceAssemblies() {
Set<ServiceAssemblyImpl> sas = new HashSet<ServiceAssemblyImpl>();
for (ServiceUnitImpl su : serviceUnits) {
sas.add(su.getServiceAssemblyImpl());
}
return sas;
}
+
+ public SharedLibraryList[] getSharedLibraries() {
+ return componentDesc.getSharedLibraries();
+ }
public void stop(boolean saveState) throws JBIException {
LOGGER.info("Stopping component " + getName());
Added:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AbstractInstaller.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AbstractInstaller.java?rev=741500&view=auto
==============================================================================
---
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AbstractInstaller.java
(added)
+++
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AbstractInstaller.java
Fri Feb 6 10:13:30 2009
@@ -0,0 +1,197 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.jbi.management;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.kernel.filemonitor.DeploymentListener;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+
+public class AbstractInstaller {
+
+ private static final Log LOGGER =
LogFactory.getLog(ComponentInstaller.class);
+
+ private BundleContext bundleContext;
+
+
+ private Map<String, String> artifactToBundle = new HashMap<String,
String>();
+ private Bundle bundle;
+
+ public synchronized void deployFile(String filename) {
+ File file = new File(filename);
+ try {
+ LOGGER.info("File is: " + filename);
+ // Transformation step
+ if (file.exists()) {
+ LOGGER.info("File exist");
+ File f = transformArtifact(file);
+ if (f == null) {
+ LOGGER.info("Unsupported deployment: " +
filename);
+ return;
+ }
+ file = f;
+ } else {
+ String transformedFile = artifactToBundle.get(filename);
+ if (transformedFile != null) {
+ file = new File(transformedFile);
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+ }
+
+ // Handle final bundles
+ if (file.exists()) {
+ deployBundle(file);
+ }
+
+ } catch (Exception e) {
+ LOGGER.info("Failed to process: " + file + ". Reason: " + e, e);
+ }
+
+ }
+
+ protected Bundle getBundleForJarFile(File file) throws IOException {
+ String absoluteFilePath = file.getAbsoluteFile().toURI().toString();
+ Bundle bundles[] = bundleContext.getBundles();
+ for (Bundle bundle : bundles) {
+ String location = bundle.getLocation();
+ if (filePathsMatch(absoluteFilePath, location)) {
+ return bundle;
+ }
+ }
+ return null;
+ }
+
+ protected static boolean filePathsMatch(String p1, String p2) {
+ p1 = normalizeFilePath(p1);
+ p2 = normalizeFilePath(p2);
+ return (p1 != null && p1.equalsIgnoreCase(p2));
+ }
+
+ protected static String normalizeFilePath( String path ) {
+ if (path != null) {
+ path = path.replaceFirst("file:/*", "");
+ path = path.replaceAll("[\\\\/]+", "/");
+ }
+ return path;
+ }
+
+
+ protected void deployBundle(File file) throws IOException, BundleException
{
+ LOGGER.info("Deploying: " + file.getCanonicalPath());
+
+ InputStream in = new FileInputStream(file);
+
+ try {
+ Bundle bundle = getBundleForJarFile(file);
+ if (bundle != null) {
+ bundle.update();
+ }
+ else {
+ bundle =
bundleContext.installBundle(file.getCanonicalFile().toURI().toString(), in);
+ bundle.start();
+ }
+ setBundle(bundle);
+ }
+ finally {
+ closeQuietly(in);
+ }
+ }
+
+ protected void closeQuietly(Closeable in) {
+ try {
+ in.close();
+ }
+ catch (IOException e) {
+ LOGGER.info("Failed to close stream. " + e, e);
+ }
+ }
+
+ public File getGenerateDir() {
+ String base = System.getProperty("servicemix.base", ".");
+ return new File(base, "data/generated-bundles");
+ }
+
+ protected File transformArtifact(File file) throws Exception {
+ // Check registered deployers
+ ServiceReference[] srvRefs =
bundleContext.getAllServiceReferences(DeploymentListener.class.getName(), null);
+ if(srvRefs != null) {
+ for(ServiceReference sr : srvRefs) {
+ try {
+ DeploymentListener deploymentListener =
(DeploymentListener) bundleContext.getService(sr);
+ if (deploymentListener.canHandle(file)) {
+ File transformedFile =
deploymentListener.handle(file, getGenerateDir());
+
artifactToBundle.put(file.getAbsolutePath(), transformedFile.getAbsolutePath());
+ return transformedFile;
+ }
+ } finally {
+ bundleContext.ungetService(sr);
+ }
+ }
+ }
+ JarFile jar = null;
+ try {
+ // Handle OSGi bundles with the default deployer
+ if (file.getName().endsWith("txt") ||
file.getName().endsWith("xml")
+ || file.getName().endsWith("properties")) {
+ // that's file type which is not supported as bundle and avoid
exception in the log
+ return null;
+ }
+ jar = new JarFile(file);
+ Manifest m = jar.getManifest();
+ if (m.getMainAttributes().getValue(new
Attributes.Name("Bundle-SymbolicName")) != null &&
+ m.getMainAttributes().getValue(new
Attributes.Name("Bundle-Version")) != null) {
+ return file;
+ }
+ } catch (Exception e) {
+ LOGGER.info("Error transforming artifact " + file.getName(), e);
+ } finally {
+ if (jar != null) {
+ jar.close();
+ }
+ }
+ return null;
+ }
+
+ public void setBundle(Bundle bundle) {
+ this.bundle = bundle;
+ }
+
+ public Bundle getBundle() {
+ return bundle;
+ }
+
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
+}
Propchange:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AbstractInstaller.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AbstractInstaller.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsService.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsService.java?rev=741500&r1=741499&r2=741500&view=diff
==============================================================================
---
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsService.java
(original)
+++
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsService.java
Fri Feb 6 10:13:30 2009
@@ -17,21 +17,29 @@
package org.apache.servicemix.jbi.management;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
import javax.jbi.JBIException;
import javax.jbi.management.LifeCycleMBean;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+
+
import org.apache.servicemix.jbi.deployer.Component;
+import org.apache.servicemix.jbi.deployer.descriptor.SharedLibraryList;
+import org.apache.servicemix.jbi.deployer.impl.ComponentImpl;
import org.apache.servicemix.jbi.deployer.impl.Deployer;
+import org.apache.servicemix.jbi.deployer.impl.ServiceAssemblyImpl;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.springframework.osgi.context.BundleContextAware;
public class AdminCommandsService implements AdminCommandsServiceMBean,
BundleContextAware {
- private static final Log LOGGER =
LogFactory.getLog(AdminCommandsService.class);
private AdminService adminService;
private InstallationService installationService;
@@ -65,7 +73,7 @@
* installation properties
* @return
*/
- public String installComponent(String fileName, boolean deferException)
throws Exception {
+ public String installComponent(String fileName) throws Exception {
try {
getInstallationService().install(fileName, null, false);
return
ManagementSupport.createSuccessMessage("installComponent", fileName);
@@ -125,14 +133,8 @@
* @param file
* @return
*/
- public String installSharedLibrary(String file, boolean deferException)
throws Exception {
- return null;
- /*if (deferException) {
- container.updateExternalArchive(file);
- return
ManagementSupport.createSuccessMessage("installSharedLibrary", file);
- } else {
- return installationService.installSharedLibrary(file);
- }*/
+ public String installSharedLibrary(String file) throws Exception {
+ return installationService.installSharedLibrary(file);
}
/**
@@ -142,7 +144,35 @@
* @return
*/
public String uninstallSharedLibrary(String name) throws Exception {
- return ManagementSupport.createSuccessMessage("to be done");
+ //Check that the library is installed
+ boolean isInstalled =
getInstallationService().containsSharedLibrary(name);
+ if (!isInstalled) {
+ throw ManagementSupport.failure("uninstallSharedLibrary", "Shared
library '" + name + "' is not installed.");
+ }
+ // Check that it is not used by a running component
+ ServiceReference[] refs =
getAdminService().getComponentServiceReferences(null);
+
+
+ for (ServiceReference ref : refs) {
+ ComponentImpl component = (ComponentImpl)
getBundleContext().getService(ref);
+ if
(!component.getCurrentState().equalsIgnoreCase(LifeCycleMBean.SHUTDOWN)) {
+ SharedLibraryList[] sls = component.getSharedLibraries();
+ if (sls != null) {
+ for (int i = 0; i < sls.length; i++) {
+ if (name.equals(sls[i].getName())) {
+ throw
ManagementSupport.failure("uninstallSharedLibrary", "Shared library '" + name
+ + "' is used by component '" +
component.getName() + "'.");
+ }
+ }
+ }
+ }
+ }
+ boolean success =
getInstallationService().uninstallSharedLibrary(name);
+ if (success) {
+ return
ManagementSupport.createSuccessMessage("uninstallSharedLibrary", name);
+ } else {
+ throw ManagementSupport.failure("uninstallSharedLibrary", name);
+ }
}
/**
@@ -208,7 +238,7 @@
* @param file
* @return
*/
- public String deployServiceAssembly(String file, boolean deferException)
throws Exception {
+ public String deployServiceAssembly(String file) throws Exception {
return null;
/*if (deferException) {
container.updateExternalArchive(file);
@@ -258,23 +288,15 @@
return getDeploymentService().shutDown(name);
}
- /**
- * load an archive from an external location and starts it The archive can
- * be a Component, Service Assembly or Shared Library.
- *
- * @param location -
- * can either be a url or filename (if relative - must be
- * relative to the container)
- * @return status
- * @throws Exception
- */
- public String installArchive(String location) throws Exception {
- return ManagementSupport.createSuccessMessage("to be done");
- }
-
+
/**
* Prints information about all components (Service Engine or Binding
- * Component) installed
+ * Component) installedServiceReference[] refs =
getAdminService().getComponentServiceReferences(filter);
+ if (excludeBCs && excludeSEs) {
+ refs = new ServiceReference[0];
+ }
+ List<Component> components = new ArrayList<Component>();
+
*
* @param serviceEngines
* @param bindingComponents
@@ -285,8 +307,83 @@
*/
public String listComponents(boolean excludeSEs, boolean excludeBCs,
String requiredState,
String sharedLibraryName, String serviceAssemblyName)
throws Exception {
- // validate requiredState
- return ManagementSupport.createSuccessMessage("to be done");
+ //validate requiredState
+ if (requiredState != null && requiredState.length() > 0
+ &&
!LifeCycleMBean.UNKNOWN.equalsIgnoreCase(requiredState)
+ &&
!LifeCycleMBean.SHUTDOWN.equalsIgnoreCase(requiredState)
+ &&
!LifeCycleMBean.STOPPED.equalsIgnoreCase(requiredState)
+ &&
!LifeCycleMBean.STARTED.equalsIgnoreCase(requiredState)) {
+ throw ManagementSupport.failure("listComponents", "Required state
'" + requiredState + "' is not a valid state.");
+ }
+ // Get components
+ String filter = null;
+ if (excludeSEs && !excludeBCs) {
+ filter = "(" + Deployer.TYPE + "=binding-component)";
+ }
+ if (excludeBCs && !excludeSEs) {
+ filter = "(" + Deployer.TYPE + "=service-engine)";
+ }
+ ServiceReference[] refs =
getAdminService().getComponentServiceReferences(filter);
+ if (excludeBCs && excludeSEs) {
+ refs = new ServiceReference[0];
+ }
+ List<Component> components = new ArrayList<Component>();
+ for (ServiceReference ref : refs) {
+ Component component = (Component)
getBundleContext().getService(ref);
+
+ // Check status
+ if (requiredState != null && requiredState.length() > 0 &&
!requiredState.equalsIgnoreCase(component.getCurrentState())) {
+ continue;
+ }
+ // Check shared library
+ // TODO: check component dependency on SL
+ if (sharedLibraryName != null && sharedLibraryName.length() > 0
+ &&
!getInstallationService().containsSharedLibrary(sharedLibraryName)) {
+ continue;
+ }
+ // Check deployed service assembly
+ if (serviceAssemblyName != null && serviceAssemblyName.length() >
0) {
+ ComponentImpl compImpl = (ComponentImpl)component;
+ Set<ServiceAssemblyImpl> saImpls =
compImpl.getServiceAssemblies();
+ boolean found = false;
+ for (ServiceAssemblyImpl sa : saImpls) {
+ if (serviceAssemblyName.equals(sa.getName())) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ continue;
+ }
+ }
+ components.add(component);
+ }
+
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("<?xml version='1.0'?>\n");
+ buffer.append("<component-info-list
xmlns='http://java.sun.com/xml/ns/jbi/component-info-list' version='1.0'>\n");
+ for (Iterator<Component> iter = components.iterator();
iter.hasNext();) {
+ Component component = iter.next();
+ buffer.append(" <component-info");
+ if (!getAdminService().isBinding(component.getName())
+ && getAdminService().isEngine(component.getName())) {
+ buffer.append(" type='service-engine'");
+ } else if (getAdminService().isBinding(component.getName())
+ && !getAdminService().isEngine(component.getName())) {
+ buffer.append(" type='binding-component'");
+ }
+ buffer.append(" name='" + component.getName() + "'");
+ buffer.append(" state='" + component.getCurrentState() + "'>\n");
+ if (component.getDescription() != null) {
+ buffer.append(" <description>");
+ buffer.append(component.getDescription());
+ buffer.append("</description>\n");
+ }
+ buffer.append(" </component-info>\n");
+ }
+ buffer.append("</component-info-list>");
+ return buffer.toString();
+
}
/**
@@ -297,7 +394,32 @@
* @return
*/
public String listSharedLibraries(String componentName, String
sharedLibraryName) throws Exception {
- return ManagementSupport.createSuccessMessage("to be done");
+ Set<String> libs = new HashSet<String>();
+ if (sharedLibraryName != null && sharedLibraryName.length() > 0) {
+ if
(getInstallationService().containsSharedLibrary(sharedLibraryName)) {
+ libs.add(sharedLibraryName);
+ }
+ } else if (componentName != null && componentName.length() > 0) {
+ ServiceReference ref =
getAdminService().getComponentServiceReference("(" + Deployer.NAME + "=" +
componentName + ")");
+ if (ref == null) {
+ throw new JBIException("Component '" + componentName + "' not
found");
+ }
+ ComponentImpl component = (ComponentImpl)
bundleContext.getService(ref);
+ for (SharedLibraryList sl : component.getSharedLibraries()) {
+ libs.add(sl.getName());
+ }
+ } else {
+ libs = getInstallationService().getInstalledSharedLibs();
+ }
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("<?xml version='1.0'?>\n");
+ buffer.append("<component-info-list
xmlns='http://java.sun.com/xml/ns/jbi/component-info-list' version='1.0'>\n");
+ for (String sl : libs) {
+ buffer.append(" <component-info type='shared-library'
name='").append(sl).append("' state='Started'>");
+ buffer.append(" </component-info>\n");
+ }
+ buffer.append("</component-info-list>");
+ return buffer.toString();
}
/**
Modified:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsServiceMBean.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsServiceMBean.java?rev=741500&r1=741499&r2=741500&view=diff
==============================================================================
---
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsServiceMBean.java
(original)
+++
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminCommandsServiceMBean.java
Fri Feb 6 10:13:30 2009
@@ -16,24 +16,21 @@
*/
package org.apache.servicemix.jbi.management;
-import java.util.Properties;
-
public interface AdminCommandsServiceMBean {
- String installComponent(String file, boolean deferException) throws
Exception;
+ String installComponent(String file) throws Exception;
String uninstallComponent(String name) throws Exception;
- String installSharedLibrary(String file, boolean deferException) throws
Exception;
+ String installSharedLibrary(String file) throws Exception;
String uninstallSharedLibrary(String name) throws Exception;
String startComponent(String name) throws Exception;
String stopComponent(String name) throws Exception;
String shutdownComponent(String name) throws Exception;
- String deployServiceAssembly(String file, boolean deferException)
throws Exception;
+ String deployServiceAssembly(String file) throws Exception;
String undeployServiceAssembly(String name) throws Exception;
String startServiceAssembly(String name) throws Exception;
String stopServiceAssembly(String name) throws Exception;
String shutdownServiceAssembly(String name) throws Exception;
- String installArchive(String location) throws Exception;
String listComponents(boolean excludeSEs,
boolean excludeBCs,
String requiredState,
Modified:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminService.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminService.java?rev=741500&r1=741499&r2=741500&view=diff
==============================================================================
---
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminService.java
(original)
+++
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/AdminService.java
Fri Feb 6 10:13:30 2009
@@ -20,7 +20,6 @@
import javax.management.ObjectName;
import org.apache.servicemix.jbi.deployer.impl.Deployer;
-import org.apache.servicemix.jbi.runtime.impl.ManagementContext;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.springframework.osgi.context.BundleContextAware;
Copied:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ComponentInstaller.java
(from r741389,
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/Installer.java)
URL:
http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ComponentInstaller.java?p2=servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ComponentInstaller.java&p1=servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/Installer.java&r1=741389&r2=741500&rev=741500&view=diff
==============================================================================
---
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/Installer.java
(original)
+++
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ComponentInstaller.java
Fri Feb 6 10:13:30 2009
@@ -17,16 +17,7 @@
package org.apache.servicemix.jbi.management;
-import java.io.Closeable;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.jar.Attributes;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
import javax.jbi.JBIException;
import javax.jbi.management.DeploymentException;
@@ -35,28 +26,25 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.servicemix.kernel.filemonitor.DeploymentListener;
import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
+
import org.osgi.framework.BundleException;
-import org.osgi.framework.ServiceReference;
-import org.springframework.osgi.context.BundleContextAware;
-public class Installer implements InstallerMBean, BundleContextAware {
+public class ComponentInstaller extends AbstractInstaller
+ implements InstallerMBean {
- private static final Log LOGGER = LogFactory.getLog(Installer.class);
+ private static final Log LOGGER =
LogFactory.getLog(ComponentInstaller.class);
private InstallationContextImpl context;
private File jbiArtifact;
private ObjectName objectName;
- private BundleContext bundleContext;
private AdminService adminService;
- private Bundle bundle;
+
- private Map<String, String> artifactToBundle = new HashMap<String,
String>();
- public Installer(InstallationContextImpl ic, File jbiArtifact,
AdminService adminService) throws DeploymentException {
+
+ public ComponentInstaller(InstallationContextImpl ic, File jbiArtifact,
AdminService adminService) throws DeploymentException {
this.context = ic;
this.jbiArtifact = jbiArtifact;
this.adminService = adminService;
@@ -164,153 +152,4 @@
this.objectName = objectName;
}
- public synchronized void deployFile(String filename) {
- File file = new File(filename);
- try {
- LOGGER.info("File is: " + filename);
- // Transformation step
- if (file.exists()) {
- LOGGER.info("File exist");
- File f = transformArtifact(file);
- if (f == null) {
- LOGGER.info("Unsupported deployment: " +
filename);
- return;
- }
- file = f;
- } else {
- String transformedFile = artifactToBundle.get(filename);
- if (transformedFile != null) {
- file = new File(transformedFile);
- if (file.exists()) {
- file.delete();
- }
- }
- }
-
- // Handle final bundles
- if (file.exists()) {
- deployBundle(file);
- }
-
- } catch (Exception e) {
- LOGGER.info("Failed to process: " + file + ". Reason: " + e, e);
- }
-
- }
-
- protected Bundle getBundleForJarFile(File file) throws IOException {
- String absoluteFilePath = file.getAbsoluteFile().toURI().toString();
- Bundle bundles[] = bundleContext.getBundles();
- for (Bundle bundle : bundles) {
- String location = bundle.getLocation();
- if (filePathsMatch(absoluteFilePath, location)) {
- return bundle;
- }
- }
- return null;
- }
-
- protected static boolean filePathsMatch(String p1, String p2) {
- p1 = normalizeFilePath(p1);
- p2 = normalizeFilePath(p2);
- return (p1 != null && p1.equalsIgnoreCase(p2));
- }
-
- protected static String normalizeFilePath( String path ) {
- if (path != null) {
- path = path.replaceFirst("file:/*", "");
- path = path.replaceAll("[\\\\/]+", "/");
- }
- return path;
- }
-
-
- protected void deployBundle(File file) throws IOException, BundleException
{
- LOGGER.info("Deploying: " + file.getCanonicalPath());
-
- InputStream in = new FileInputStream(file);
-
- try {
- Bundle bundle = getBundleForJarFile(file);
- if (bundle != null) {
- bundle.update();
- }
- else {
- bundle =
bundleContext.installBundle(file.getCanonicalFile().toURI().toString(), in);
- bundle.start();
- }
- setBundle(bundle);
- }
- finally {
- closeQuietly(in);
- }
- }
-
- protected void closeQuietly(Closeable in) {
- try {
- in.close();
- }
- catch (IOException e) {
- LOGGER.info("Failed to close stream. " + e, e);
- }
- }
-
- public File getGenerateDir() {
- String base = System.getProperty("servicemix.base", ".");
- return new File(base, "data/generated-bundles");
- }
-
- private File transformArtifact(File file) throws Exception {
- // Check registered deployers
- ServiceReference[] srvRefs =
bundleContext.getAllServiceReferences(DeploymentListener.class.getName(), null);
- if(srvRefs != null) {
- for(ServiceReference sr : srvRefs) {
- try {
- DeploymentListener deploymentListener =
(DeploymentListener) bundleContext.getService(sr);
- if (deploymentListener.canHandle(file)) {
- File transformedFile =
deploymentListener.handle(file, getGenerateDir());
-
artifactToBundle.put(file.getAbsolutePath(), transformedFile.getAbsolutePath());
- return transformedFile;
- }
- } finally {
- bundleContext.ungetService(sr);
- }
- }
- }
- JarFile jar = null;
- try {
- // Handle OSGi bundles with the default deployer
- if (file.getName().endsWith("txt") ||
file.getName().endsWith("xml")
- || file.getName().endsWith("properties")) {
- // that's file type which is not supported as bundle and avoid
exception in the log
- return null;
- }
- jar = new JarFile(file);
- Manifest m = jar.getManifest();
- if (m.getMainAttributes().getValue(new
Attributes.Name("Bundle-SymbolicName")) != null &&
- m.getMainAttributes().getValue(new
Attributes.Name("Bundle-Version")) != null) {
- return file;
- }
- } catch (Exception e) {
- LOGGER.info("Error transforming artifact " + file.getName(), e);
- } finally {
- if (jar != null) {
- jar.close();
- }
- }
- return null;
- }
-
- public void setBundleContext(BundleContext bundleContext) {
- this.bundleContext = bundleContext;
- }
-
- public void setBundle(Bundle bundle) {
- this.bundle = bundle;
- }
-
- public Bundle getBundle() {
- return bundle;
- }
-
}
Modified:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/InstallationService.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/InstallationService.java?rev=741500&r1=741499&r2=741500&view=diff
==============================================================================
---
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/InstallationService.java
(original)
+++
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/InstallationService.java
Fri Feb 6 10:13:30 2009
@@ -20,6 +20,7 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.jbi.JBIException;
@@ -39,9 +40,11 @@
private static final Log LOG =
LogFactory.getLog(InstallationService.class);
- private Map<String, Installer> installers = new ConcurrentHashMap<String,
Installer>();
+ private Map<String, ComponentInstaller> installers = new
ConcurrentHashMap<String, ComponentInstaller>();
- private Map<String, Installer> nonLoadedInstallers = new
ConcurrentHashMap<String, Installer>();
+ private Map<String, ComponentInstaller> nonLoadedInstallers = new
ConcurrentHashMap<String, ComponentInstaller>();
+
+ private Map<String, SharedLibInstaller> sharedLibinstallers = new
ConcurrentHashMap<String, SharedLibInstaller>();
private AdminService adminService;
@@ -70,7 +73,7 @@
if (desc != null && desc.getComponent() != null) {
String componentName =
desc.getComponent().getIdentification().getName();
if (!installers.containsKey(componentName)) {
- Installer installer = doInstallArchive(desc, jarfile);
+ ComponentInstaller installer = doInstallArchive(desc,
jarfile);
if (installer != null) {
result = installer.getObjectName();
installers.put(componentName, installer);
@@ -98,8 +101,8 @@
}
}
- private Installer doInstallArchive(Descriptor desc, File jarfile) throws
Exception {
- return new Installer(new
InstallationContextImpl(desc.getComponent(), getNamingStrategy(),
getManagementAgent()),
+ private ComponentInstaller doInstallArchive(Descriptor desc, File jarfile)
throws Exception {
+ return new ComponentInstaller(new
InstallationContextImpl(desc.getComponent(), getNamingStrategy(),
getManagementAgent()),
jarfile, getAdminService());
}
@@ -112,7 +115,7 @@
* existing installation context.
*/
public ObjectName loadInstaller(String aComponentName) {
- Installer installer = installers.get(aComponentName);
+ ComponentInstaller installer = installers.get(aComponentName);
if (installer == null) {
installer = nonLoadedInstallers.get(aComponentName);
if (installer != null) {
@@ -142,8 +145,8 @@
public boolean unloadInstaller(String componentName, boolean
isToBeDeleted) {
boolean result = false;
try {
- Installer installer = installers.remove(componentName);
- result = installer != null;
+ ComponentInstaller installer = installers.remove(componentName);
+ result = installer != null;
if (result) {
getManagementAgent().unregister(installer.getObjectName());
if (isToBeDeleted) {
@@ -167,8 +170,42 @@
* URI locating a jar file containing a shared library.
* @return - the name of the shared library loaded from aSharedLibURI.
*/
- public String installSharedLibrary(String aSharedLibURI) {
- return ManagementSupport.createSuccessMessage("to be done");
+ public String installSharedLibrary(String location) {
+ File jarfile = new File(location);
+ String slName = null;
+ try {
+ if (jarfile.exists()) {
+ Descriptor desc = null;
+ try {
+ desc = Transformer.getDescriptor(jarfile);
+ } catch (Exception e) {
+ LOG.error("install sharedLib failed", e);
+ throw new DeploymentException("install
sharedLib failed", e);
+ }
+ if (desc != null) {
+ if (desc.getSharedLibrary() == null) {
+ throw new DeploymentException("JBI descriptor is not a
sharedLib descriptor");
+ }
+ slName = desc.getSharedLibrary().getIdentification().getName();
+ LOG.info("Install ShareLib " + slName);
+ if (sharedLibinstallers.containsKey(slName)) {
+ throw new DeploymentException("ShareLib " + slName+ " is
already installed");
+ }
+ SharedLibInstaller slInstaller = new
SharedLibInstaller(slName, this.getAdminService());
+ slInstaller.install(location);
+ sharedLibinstallers.put(slName, slInstaller);
+
+ return slName;
+ } else {
+ throw new DeploymentException("Could not find JBI descriptor");
+ }
+ } else {
+ throw new DeploymentException("Could not find sharedLib");
+ }
+ } catch (Exception e) {
+ LOG.error("install SharedLib failed", e);
+ }
+ return slName;
}
/**
@@ -179,9 +216,20 @@
* @return - true iff the uninstall was successful.
*/
public boolean uninstallSharedLibrary(String aSharedLibName) {
- // TODO
- return false;
-
+ boolean result = false;
+ try {
+ SharedLibInstaller installer =
sharedLibinstallers.remove(aSharedLibName);
+ result = installer != null;
+ if (result) {
+ installer.uninstall();
+
+ }
+ } catch (Exception e) {
+ String errStr = "Problem uninstall SL: " + aSharedLibName;
+ LOG.error(errStr, e);
+ } finally {
+ }
+ return result;
}
/**
@@ -211,7 +259,7 @@
throw new DeploymentException("Could not find JBI descriptor");
}
} else {
- throw new DeploymentException("Could not find JBI descriptor");
+ throw new DeploymentException("Could not find component");
}
}
@@ -229,7 +277,7 @@
if (installers.containsKey(componentName)) {
throw new DeploymentException("Component " + componentName + "
is already installed");
}
- Installer installer = null;
+ ComponentInstaller installer = null;
try {
installer = doInstallArchive(desc, jarfile);
} catch (Exception e1) {
@@ -289,5 +337,13 @@
public ManagementAgent getManagementAgent() {
return managementAgent;
}
+
+ public boolean containsSharedLibrary(String sharedLibraryName) {
+ return sharedLibinstallers.containsKey(sharedLibraryName);
+ }
+
+ public Set<String> getInstalledSharedLibs() {
+ return sharedLibinstallers.keySet();
+ }
}
Added:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/SharedLibInstaller.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/SharedLibInstaller.java?rev=741500&view=auto
==============================================================================
---
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/SharedLibInstaller.java
(added)
+++
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/SharedLibInstaller.java
Fri Feb 6 10:13:30 2009
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.jbi.management;
+
+import javax.jbi.JBIException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+public class SharedLibInstaller extends AbstractInstaller {
+
+ private static final Log LOGGER =
LogFactory.getLog(SharedLibInstaller.class);
+
+ private String name;
+ private AdminService adminService;
+
+ public SharedLibInstaller(String name, AdminService adminService) {
+ this.name = name;
+ this.adminService = adminService;
+ setBundleContext(adminService.getBundleContext());
+ }
+
+ public void install(String filename) {
+ deployFile(filename);
+ }
+
+ public void uninstall() throws javax.jbi.JBIException {
+ try {
+ Bundle bundle = getBundle();
+
+ if (bundle == null) {
+ LOGGER.warn("Could not find Bundle for shared lib: " + name);
+ }
+ else {
+ bundle.stop();
+ bundle.uninstall();
+ }
+ } catch (BundleException e) {
+ LOGGER.error("failed to uninstall shared lib: " + name, e);
+ throw new JBIException(e);
+ }
+ }
+}
Propchange:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/SharedLibInstaller.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/SharedLibInstaller.java
------------------------------------------------------------------------------
svn:keywords = Rev Date