You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by sp...@apache.org on 2006/09/06 22:47:40 UTC

svn commit: r440863 - in /geronimo/devtools/eclipse-plugin/trunk/plugins: org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/ org.apache.geronimo.st.v11.core/src/org/apache/geronimo/st/v11/core/

Author: sppatel
Date: Wed Sep  6 13:47:39 2006
New Revision: 440863

URL: http://svn.apache.org/viewvc?view=rev&rev=440863
Log:
GERONIMO-2324 first drop.. allow sharedlib entries in place

Added:
    geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/ISharedLibEntryCreationDataModelProperties.java   (with props)
    geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryCreationOperation.java   (with props)
    geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryDataModelProvider.java   (with props)
Modified:
    geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v11.core/src/org/apache/geronimo/st/v11/core/GeronimoServerBehaviour.java

Added: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/ISharedLibEntryCreationDataModelProperties.java
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/ISharedLibEntryCreationDataModelProperties.java?view=auto&rev=440863
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/ISharedLibEntryCreationDataModelProperties.java (added)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/ISharedLibEntryCreationDataModelProperties.java Wed Sep  6 13:47:39 2006
@@ -0,0 +1,24 @@
+/**
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.geronimo.st.core.operations;
+
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
+
+public interface ISharedLibEntryCreationDataModelProperties extends IDataModelProperties {
+
+	public static final String MODULE = "ISharedLibEntryCreationDataModelProperties.MODULE";
+	
+}

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/ISharedLibEntryCreationDataModelProperties.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/ISharedLibEntryCreationDataModelProperties.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/ISharedLibEntryCreationDataModelProperties.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryCreationOperation.java
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryCreationOperation.java?view=auto&rev=440863
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryCreationOperation.java (added)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryCreationOperation.java Wed Sep  6 13:47:39 2006
@@ -0,0 +1,190 @@
+/**
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.geronimo.st.core.operations;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.server.core.FacetUtil;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IModuleType;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.ServerUtil;
+
+public class SharedLibEntryCreationOperation extends AbstractDataModelOperation implements ISharedLibEntryCreationDataModelProperties {
+
+	public SharedLibEntryCreationOperation() {
+	}
+
+	/**
+	 * @param model
+	 */
+	public SharedLibEntryCreationOperation(IDataModel model) {
+		super(model);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse.core.runtime.IProgressMonitor,
+	 *      org.eclipse.core.runtime.IAdaptable)
+	 */
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IModule module = (IModule) model.getProperty(MODULE);
+		
+		//TODO process child modules if ear project
+		
+		IProject project = module.getProject();
+		try {
+
+			// determine the dummy jar path from project name and runtime
+			// location
+			IFacetedProject fp = ProjectFacetsManager.create(project);
+			IRuntime runtime = FacetUtil.getRuntime(fp.getPrimaryRuntime());
+			String dummyJarName = project.getName() + ".eclipse.jar";
+			File dummyJarFile = runtime.getLocation().append("var/shared/lib").append((dummyJarName)).toFile();
+
+			// delete the dummy jar and return if module no longer associated
+			// with server with the same runtime
+			boolean delete = true;
+			IServer[] servers = ServerUtil.getServersByModule(module, monitor);
+			for (int i = 0; i < servers.length; i++) {
+				if (runtime.equals(servers[i].getRuntime())) {
+					delete = false;
+					break;
+				}
+			}
+			if (delete) {
+				if (dummyJarFile.delete()) {
+					return Status.OK_STATUS;
+				} else {
+					// don't need to recycle shared lib
+					return Status.CANCEL_STATUS;
+				}
+			}
+
+			// filter the cp entries needed to be added to the dummy shared lib
+			// jar
+			HashSet entries = new HashSet();
+			IJavaProject jp = JavaCore.create(project);
+			IClasspathEntry[] cp = jp.getRawClasspath();
+			for (int i = 0; i < cp.length; i++) {
+				IClasspathEntry entry = cp[i];
+				int kind = entry.getEntryKind();
+				if (kind == IClasspathEntry.CPE_LIBRARY
+						|| kind == IClasspathEntry.CPE_VARIABLE) {
+					if (kind == IClasspathEntry.CPE_VARIABLE) {
+						// TODO exclude and return if web-inf/lib entries
+					}
+					IClasspathEntry resolved = JavaCore.getResolvedClasspathEntry(entry);
+					entries.add(resolved.getPath().makeAbsolute().toOSString());
+				}
+			}
+
+			// Set entries = (Set) model.getProperty(CP_ENTRIES);
+			// regen the jar only if required
+			if (regenerate(dummyJarFile, entries)) {
+				dummyJarFile.delete();
+				Manifest manifest = new Manifest();
+				Attributes attributes = manifest.getMainAttributes();
+				attributes.put(Attributes.Name.MANIFEST_VERSION, "1.0");
+				attributes.put(Attributes.Name.CLASS_PATH, getCPEntriesAsString(entries));
+				JarOutputStream os = new JarOutputStream(new FileOutputStream(dummyJarFile), manifest);
+				os.flush();
+				os.close();
+			} else {
+				return Status.CANCEL_STATUS;
+			}
+		} catch (Exception e) {
+			throw new ExecutionException("Failed to update shared lib.", e);
+		}
+
+		return Status.OK_STATUS;
+	}
+
+	/**
+	 * @param entries
+	 * @return
+	 */
+	private String getCPEntriesAsString(Set entries) {
+		StringBuffer buffer = new StringBuffer();
+		Iterator i = entries.iterator();
+		while (i.hasNext()) {
+			String cpEntry = (String) i.next();
+			buffer.append(cpEntry);
+			if (i.hasNext()) {
+				buffer.append(" ");
+			}
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * @param jarPath
+	 * @param entries
+	 * @return
+	 * @throws Exception
+	 */
+	private boolean regenerate(File jarFile, Set entries) throws Exception {
+		if (jarFile.exists()) {
+			if (entries.isEmpty()) {
+				// go ahead and return if zero entires, dummy jar will be
+				// deleted
+				return true;
+			} else {
+				JarFile jar = new JarFile(jarFile);
+				Manifest manifest = jar.getManifest();
+				Attributes attributes = manifest.getMainAttributes();
+				String value = attributes.getValue(Attributes.Name.CLASS_PATH);
+				jar.close();
+
+				Set currentEntries = new HashSet();
+				if (value != null) {
+					StringTokenizer tokenizer = new StringTokenizer(value);
+					while (tokenizer.hasMoreTokens()) {
+						currentEntries.add(tokenizer.nextToken());
+					}
+				}
+				// regen dummy jar if old and new entries don't match
+				return !entries.equals(currentEntries);
+			}
+		}
+
+		return !entries.isEmpty();
+	}
+}

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryCreationOperation.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryCreationOperation.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryCreationOperation.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryDataModelProvider.java
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryDataModelProvider.java?view=auto&rev=440863
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryDataModelProvider.java (added)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryDataModelProvider.java Wed Sep  6 13:47:39 2006
@@ -0,0 +1,42 @@
+/**
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.geronimo.st.core.operations;
+
+import java.util.Set;
+
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+public class SharedLibEntryDataModelProvider extends AbstractDataModelProvider implements ISharedLibEntryCreationDataModelProperties {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider#getPropertyNames()
+	 */
+	public Set getPropertyNames() {
+		Set names = super.getPropertyNames();
+		names.add(MODULE);
+		return names;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider#getDefaultOperation()
+	 */
+	public IDataModelOperation getDefaultOperation() {
+		return new SharedLibEntryCreationOperation(model);
+	}
+}

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryDataModelProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryDataModelProvider.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev

Propchange: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/org/apache/geronimo/st/core/operations/SharedLibEntryDataModelProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v11.core/src/org/apache/geronimo/st/v11/core/GeronimoServerBehaviour.java
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v11.core/src/org/apache/geronimo/st/v11/core/GeronimoServerBehaviour.java?view=diff&rev=440863&r1=440862&r2=440863
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v11.core/src/org/apache/geronimo/st/v11/core/GeronimoServerBehaviour.java (original)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v11.core/src/org/apache/geronimo/st/v11/core/GeronimoServerBehaviour.java Wed Sep  6 13:47:39 2006
@@ -18,11 +18,17 @@
 import java.net.URL;
 import java.util.Set;
 
-import javax.enterprise.deploy.spi.Target;
+import javax.enterprise.deploy.spi.DeploymentManager;
+import javax.enterprise.deploy.spi.TargetModuleID;
+import javax.enterprise.deploy.spi.exceptions.TargetException;
+import javax.enterprise.deploy.spi.status.ProgressEvent;
+import javax.enterprise.deploy.spi.status.ProgressListener;
+import javax.enterprise.deploy.spi.status.ProgressObject;
 import javax.management.MBeanServerConnection;
 import javax.naming.directory.NoSuchAttributeException;
 
-import org.apache.geronimo.deployment.plugin.TargetImpl;
+import org.apache.geronimo.deployment.plugin.TargetModuleIDImpl;
+import org.apache.geronimo.deployment.util.DeploymentUtil;
 import org.apache.geronimo.gbean.AbstractName;
 import org.apache.geronimo.gbean.AbstractNameQuery;
 import org.apache.geronimo.gbean.GBeanData;
@@ -33,12 +39,25 @@
 import org.apache.geronimo.kernel.config.InvalidConfigException;
 import org.apache.geronimo.kernel.config.PersistentConfigurationList;
 import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.st.core.Activator;
+import org.apache.geronimo.st.core.DeploymentUtils;
 import org.apache.geronimo.st.core.GeronimoConnectionFactory;
 import org.apache.geronimo.st.core.GeronimoServerBehaviourDelegate;
+import org.apache.geronimo.st.core.commands.DeploymentCommandFactory;
+import org.apache.geronimo.st.core.operations.ISharedLibEntryCreationDataModelProperties;
+import org.apache.geronimo.st.core.operations.SharedLibEntryCreationOperation;
+import org.apache.geronimo.st.core.operations.SharedLibEntryDataModelProvider;
 import org.apache.geronimo.st.v11.core.internal.Trace;
 import org.apache.geronimo.system.jmx.KernelDelegate;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
 import org.eclipse.wst.server.core.IModule;
 import org.eclipse.wst.server.core.IServer;
 import org.eclipse.wst.server.core.internal.IModulePublishHelper;
@@ -89,7 +108,8 @@
 			} catch (SecurityException e) {
 				throw e;
 			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Kernel connection failed. " + e.getMessage());
+				Trace.trace(Trace.WARNING, "Kernel connection failed. "
+						+ e.getMessage());
 			}
 		}
 		return kernel;
@@ -189,4 +209,90 @@
 	protected ClassLoader getContextClassLoader() {
 		return Kernel.class.getClassLoader();
 	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.geronimo.st.core.GeronimoServerBehaviourDelegate#doDeploy(org.eclipse.wst.server.core.IModule)
+	 */
+	protected void doDeploy(IModule module) throws Exception {
+		updateSharedLib(module);
+		super.doDeploy(module);
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.geronimo.st.core.GeronimoServerBehaviourDelegate#doRedeploy(org.eclipse.wst.server.core.IModule)
+	 */
+	protected void doRedeploy(IModule module) throws Exception {
+		super.unDeploy(module);
+		updateSharedLib(module);
+		super.doDeploy((module));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.geronimo.st.core.GeronimoServerBehaviourDelegate#doUndeploy(org.eclipse.wst.server.core.IModule)
+	 */
+	protected void doUndeploy(IModule module) throws Exception {
+		super.doUndeploy(module);
+		updateSharedLib(module);
+	}
+
+	private void updateSharedLib(IModule module) throws CoreException {
+		IDataModel model = DataModelFactory.createDataModel(new SharedLibEntryDataModelProvider());
+		model.setProperty(ISharedLibEntryCreationDataModelProperties.MODULE, module);
+		IDataModelOperation op = new SharedLibEntryCreationOperation(model);
+		try {
+			IStatus status = op.execute(new NullProgressMonitor(), null);
+			if (status.isOK()) {
+				DeploymentManager dm = DeploymentCommandFactory.getDeploymentManager(getServer());
+				TargetModuleID id = null;
+				try {
+					TargetModuleID[] ids = dm.getAvailableModules(null, dm.getTargets());
+					for(int i = 0; i < ids.length; i++) {
+						if(ids[i].getModuleID().indexOf("sharedlib") > 0) {
+							id = ids[i];
+							break;
+						}
+					}	
+				} catch (Exception e) {
+					e.printStackTrace();
+				} 
+				
+				if(id != null) {
+					TargetModuleID[] ids = new TargetModuleID[]{id};
+					ProgressObject po = dm.stop(ids);
+					waitForProgress(po);
+					if(po.getDeploymentStatus().isCompleted()) {
+						Trace.trace(Trace.INFO, id.getModuleID() + " stopped.");
+					}
+					
+					po = dm.start(ids);
+					waitForProgress(po);
+					
+					if(po.getDeploymentStatus().isCompleted()) {
+						Trace.trace(Trace.INFO, id.getModuleID() + " started.");
+					}
+				}
+			}
+		} catch (ExecutionException e) {
+			throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "Error updating shared lib configuration.", e));
+		}
+	}
+
+	protected void waitForProgress(ProgressObject po) throws CoreException {
+		while (po.getDeploymentStatus().isRunning()) {
+			try {
+				Thread.sleep(100);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+		return;
+	}
+
 }