blob: 8e3453fc2ee42c5ebd200b765b219b48f5511f61 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BSI Business Systems Integration AG.
* 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:
* BSI Business Systems Integration AG - initial API and implementation
******************************************************************************/
package org.eclipse.scout.sdk.rap.operations.project;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Enumeration;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.scout.commons.IOUtility;
import org.eclipse.scout.sdk.operation.IOperation;
import org.eclipse.scout.sdk.rap.IScoutSdkRapConstants;
import org.eclipse.scout.sdk.rap.ScoutSdkRap;
import org.eclipse.scout.sdk.util.resources.ResourceUtility;
import org.eclipse.scout.sdk.util.typecache.IWorkingCopyManager;
import org.osgi.framework.Bundle;
/**
* <h3>{@link ScoutRapTargetCreationOperation}</h3> ...
*
* @author Matthias Villiger
* @since 3.8.0 20.03.2012
*/
public class ScoutRapTargetCreationOperation implements IOperation {
private final static String SCOUT_RAP_TARGET_PLUGIN_SUB_DIR = "resources/org.eclipse.scout.rt.rap.target.repo";
private final Bundle m_sourcePlugin;
private File m_destinationDir;
public ScoutRapTargetCreationOperation() {
m_sourcePlugin = Platform.getBundle(IScoutSdkRapConstants.ScoutRapTargetPlugin);
}
@Override
public String getOperationName() {
return "Creating new Scout RAP target in directory '" + getDestinationDirectory() + "'.";
}
@Override
public void validate() throws IllegalArgumentException {
if (getDestinationDirectory() == null) {
throw new IllegalArgumentException("the destination directory can not be null.");
}
if (getSourcePlugin() == null) {
throw new IllegalArgumentException("the plugin '" + IScoutSdkRapConstants.ScoutRapTargetPlugin + "' can not be found.");
}
}
@Override
public void run(IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException, IllegalArgumentException {
try {
final String suffix = ".jar";
IOUtility.deleteDirectory(getDestinationDirectory());
Enumeration<URL> urls = getSourcePlugin().findEntries(SCOUT_RAP_TARGET_PLUGIN_SUB_DIR, "*", true);
if (urls != null) {
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
extract(url);
}
}
File featuresFolder = new File(getDestinationDirectory(), "features");
if (featuresFolder.exists()) {
File[] featureJars = featuresFolder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(suffix);
}
});
for (File jar : featureJars) {
File dest = new File(featuresFolder, jar.getName().substring(0, jar.getName().length() - suffix.length()));
ResourceUtility.extractZip(jar, dest);
IOUtility.deleteFile(jar.getAbsolutePath());
}
}
IOUtility.deleteFile(new File(getDestinationDirectory().getAbsolutePath(), "artifacts.jar").getAbsolutePath());
IOUtility.deleteFile(new File(getDestinationDirectory().getAbsolutePath(), "content.jar").getAbsolutePath());
}
catch (IOException e) {
ScoutSdkRap.logError("Unable to create new Scout RAP target.", e);
}
}
private void extract(URL source) throws IOException {
InputStream in = null;
OutputStream out = null;
try {
String relPath = source.getFile();
if (!relPath.endsWith("/")) { // skip directories
String destRelPath = relPath;
String prefix = "/" + SCOUT_RAP_TARGET_PLUGIN_SUB_DIR + "/";
if (destRelPath.startsWith(prefix)) {
destRelPath = destRelPath.substring(prefix.length());
}
File dest = new File(getDestinationDirectory(), destRelPath);
dest.getParentFile().mkdirs();
out = new BufferedOutputStream(new FileOutputStream(dest), ResourceUtility.BUF_SIZE);
in = source.openStream();
ResourceUtility.copy(in, out);
}
}
finally {
if (in != null) {
try {
in.close();
}
catch (Exception e) {
}
}
if (out != null) {
try {
out.close();
}
catch (Exception e) {
}
}
}
}
public void setDestinationDirectory(File dir) {
m_destinationDir = dir;
}
public File getDestinationDirectory() {
return m_destinationDir;
}
private Bundle getSourcePlugin() {
return m_sourcePlugin;
}
}