blob: a416fdc1dc41ecf0e37c5f509373e36a2eaa569a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Eteration A.S. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* - This code is based on WTP SDK frameworks and Tomcat Server Adapters
* org.eclipse.jst.server.core
* org.eclipse.jst.server.ui
*
* Naci Dai and Murat Yener, Eteration A.S.
*******************************************************************************/
package org.eclipse.libra.framework.core.publish;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
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.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.libra.framework.core.FrameworkInstanceConfiguration;
import org.eclipse.pde.core.IModel;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.ModelEntry;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.core.target.ITargetDefinition;
import org.eclipse.pde.core.target.TargetBundle;
import org.eclipse.pde.internal.core.WorkspaceModelManager;
import org.eclipse.pde.internal.core.exports.FeatureExportInfo;
import org.eclipse.pde.internal.core.exports.PluginExportOperation;
import org.eclipse.pde.internal.ui.PDEPluginImages;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.ui.progress.IProgressConstants;
import org.eclipse.wst.server.core.IModule;
@SuppressWarnings("restriction")
public abstract class PublishHelper {
protected abstract IPath getPublishFolder();
public String getServerModules(List<IModule[]> modules, String prefix, String spacer) {
StringBuilder builder = new StringBuilder();
for (IModule[] moduleArr: modules) {
for (IModule module : moduleArr) {
if (builder.length() > 0)
builder.append(spacer); //$NON-NLS-1$
IPluginModelBase[] models = PluginRegistry.getActiveModels();
IPath publishFolder = getPublishFolder();
for (IPluginModelBase iPluginModelBase : models) {
if (iPluginModelBase.getBundleDescription().getName()
.equalsIgnoreCase(module.getName())) {
if (builder.indexOf(iPluginModelBase.getPluginBase()
.getId()
+ "_"
+ iPluginModelBase.getPluginBase().getVersion()
+ ".jar") < 0) {
builder.append(prefix
+ publishFolder.append(
iPluginModelBase.getPluginBase()
.getId()
+ "_"
+ iPluginModelBase
.getPluginBase()
.getVersion()
+ ".jar").toOSString());
break;
}
}
}
}
}
return builder.toString();
}
public String getTargetBundles(FrameworkInstanceConfiguration config,
String prefix, String spacer) {
StringBuffer buffer = new StringBuffer();
String[] paths = getTargetBundlePaths(config);
for (int i = 0; i < paths.length; i++) {
String path = paths[i];
if (buffer.length() > 0)
buffer.append(spacer); //$NON-NLS-1$
buffer.append(prefix + path);
}
return buffer.toString();
}
public String[] getTargetBundlePaths(FrameworkInstanceConfiguration config) {
List<String> all = new ArrayList<String>();
ITargetDefinition targetDefinition = config.getTargetDefinition();
targetDefinition.resolve(new NullProgressMonitor());
TargetBundle[] targetBundles = targetDefinition.getBundles();
for (TargetBundle b : targetBundles) {
if (b.getStatus().getSeverity() == IStatus.OK) {
all.add(b.getBundleInfo().getLocation().getRawPath());
}
}
return all.toArray(new String[all.size()]);
}
public TargetBundle[] getTargetBundles(FrameworkInstanceConfiguration config) {
ITargetDefinition targetDefinition = config.getTargetDefinition();
targetDefinition.resolve(new NullProgressMonitor());
TargetBundle[] targetBundles = targetDefinition.getBundles();
return targetBundles;
}
public String[] getTargetBundleIds(FrameworkInstanceConfiguration config) {
List<String> all = new ArrayList<String>();
ITargetDefinition targetDefinition = config.getTargetDefinition();
targetDefinition.resolve(new NullProgressMonitor());
TargetBundle[] targetBundles = targetDefinition.getBundles();
for (TargetBundle b : targetBundles) {
if (b.getStatus().getSeverity() == IStatus.OK) {
all.add(b.getBundleInfo().getSymbolicName());
}
}
return all.toArray(new String[all.size()]);
}
public void exportBundles(List<IModule[]> modules,
FrameworkInstanceConfiguration config, IPath location) {
exportBundles(modules, config, location, null);
}
/**
* @param modules
* @param config not really used
* @param location
* @param tmpLocation
*/
public void exportBundles(List<IModule[]> modules,
FrameworkInstanceConfiguration config, final IPath location,
final IPath tmpLocation) {
final FeatureExportInfo info = new FeatureExportInfo();
info.toDirectory = true;
info.useJarFormat = true;
info.exportSource = true;
info.exportSourceBundle = false;
info.allowBinaryCycles = true;
info.useWorkspaceCompiledClasses = true;
info.destinationDirectory = tmpLocation == null ? location
.makeAbsolute().toOSString() : tmpLocation.makeAbsolute()
.toOSString();
List<Object> allWsBundles = new ArrayList<Object>();
List<IProject> allBinBundles = new ArrayList<IProject>();
for (IModule[] moduleArr: modules) {
try {
for (IModule iModule : moduleArr) {
IProject project = iModule.getProject();
IPluginModelBase pmb = PluginRegistry.findModel(project);
ModelEntry entry = null;
if(pmb != null)
entry = PluginRegistry.findEntry(pmb
.getBundleDescription().getSymbolicName());
if (!WorkspaceModelManager.isBinaryProject(project)
&& WorkspaceModelManager.isPluginProject(project)) {
if (entry != null
&& entry.getModel() != null
&& isValidModel(entry.getModel())
&& hasBuildProperties(entry.getModel())
) {
allWsBundles.add(entry.getModel());
} else {
allBinBundles.add(project);
}
} else if (WorkspaceModelManager.isBinaryProject(project)
&& WorkspaceModelManager.isPluginProject(project)) {
allBinBundles.add(project);
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
copyBinaryJars(allBinBundles, (tmpLocation == null ? location
: tmpLocation));
info.items = allWsBundles.toArray();
info.signingInfo = null;
info.qualifier = "qualifier";
final PluginExportOperation job = new PluginExportOperation(info,
PDEUIMessages.PluginExportJob_name);
job.setUser(true);
job.setRule(ResourcesPlugin.getWorkspace().getRoot());
job.setProperty(IProgressConstants.ICON_PROPERTY,
PDEPluginImages.DESC_PLUGIN_OBJ);
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
if (event.getResult().isOK()) {
try {
if (tmpLocation != null) {
// MOVE ALL
// TODO Move this to a separate Job with feedback if errors occur?
File sourceFiles = tmpLocation.append("/plugins").toFile();
File[] fileList = sourceFiles.listFiles();
if (fileList != null) for (File jars : fileList) {
File destFile = location.append(jars.getName()).toFile();
if (!destFile.exists()) {
if (! destFile.createNewFile()){
throw new IOException("Could not create destination file: "+destFile);
}
}
FileInputStream fIn = null;
FileOutputStream fOut = null;
FileChannel source = null;
FileChannel destination = null;
try {
source = (fIn=new FileInputStream(jars)).getChannel();
destination = (fOut=new FileOutputStream(destFile)).getChannel();
destination.transferFrom(source, 0, source.size());
} finally {
if (fIn!=null){
try{
fIn.close();
}catch(IOException x){
x.printStackTrace();
}
}
if (fOut!=null){
try{
fOut.close();
}catch(IOException x){
x.printStackTrace();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
job.schedule();
}
private static void copyBinaryJars(List<IProject> list, IPath location) {
FileInputStream fIn = null;
FileOutputStream fOut = null;
FileChannel inChannel = null;
FileChannel outChannel = null;
try {
for (IProject project : list) {
for (IResource resource : project.members(true)) {
if (("jar".equalsIgnoreCase(resource.getFileExtension()))) {
String jarId = "";
IPluginModelBase[] models = PluginRegistry
.getWorkspaceModels();
for (IPluginModelBase iPluginModelBase : models) {
if (iPluginModelBase
.getPluginBase()
.getId()
.equalsIgnoreCase(
resource.getProject().getName())) {
iPluginModelBase.getPluginBase().getId();
jarId = iPluginModelBase.getPluginBase()
.getId()
+ "_"
+ iPluginModelBase.getPluginBase()
.getVersion() + ".jar";
}
}
fIn = new FileInputStream(new File(resource.getLocationURI()));
fOut = new FileOutputStream(new File(location
.append(jarId).makeAbsolute()
.toPortableString())
);
inChannel = fIn.getChannel();
outChannel = fOut.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (CoreException e) {
e.printStackTrace();
} finally {
if (fIn != null)
try {
fIn.close();
} catch (IOException e) {
e.printStackTrace();
}
if (fOut != null)
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static boolean hasBuildProperties(IPluginModelBase model) {
File file = new File(model.getInstallLocation(), "build.properties"); //$NON-NLS-1$
return file.exists();
}
protected boolean isValidModel(IModel model) {
return model != null && model instanceof IPluginModelBase;
}
}