blob: db23e498dcaab9409a32de6094bf1d08fe8d2e5c [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2009, 2012 SpringSource, a division of VMware, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.runtime.core.provisioning;
import java.io.File;
import java.io.IOException;
import java.util.Set;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.virgo.ide.runtime.core.ServerCorePlugin;
import org.eclipse.virgo.ide.runtime.core.artefacts.Artefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.BundleArtefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.IArtefactTyped;
import org.eclipse.virgo.ide.runtime.core.artefacts.LibraryArtefact;
import org.eclipse.virgo.ide.runtime.internal.core.VirgoServerRuntime;
import org.eclipse.virgo.ide.runtime.internal.core.utils.WebDownloadUtils;
import org.eclipse.virgo.util.io.FileCopyUtils;
import org.eclipse.wst.server.core.IRuntime;
/**
* Eclipse background job that downloads selected bundles and libraries from the remote enterprise bundle repository.
*
* @author Christian Dupuis
* @since 1.0.0
*/
public class RepositoryProvisioningJob extends Job {
private static final Object CONTENT_FAMILY = new Object();
private final Set<Artefact> artifactsToDownload;
private boolean downloadSources = false;
private boolean downloadBinary = true;
protected Set<IRuntime> runtimes;
public RepositoryProvisioningJob(Set<IRuntime> runtimes, Set<Artefact> artifactsToDownload, boolean downloadSources) {
this(runtimes, artifactsToDownload, true, downloadSources);
}
public RepositoryProvisioningJob(Set<IRuntime> runtimes, Set<Artefact> artifactsToDownload, boolean downloadBinary, boolean downloadSources) {
super("Downloading bundles and libraries from Enterprise Bundle Repository");
this.runtimes = runtimes;
this.artifactsToDownload = artifactsToDownload;
this.downloadSources = downloadSources;
this.downloadBinary = downloadBinary;
setPriority(Job.LONG);
}
public Set<IRuntime> getRuntimes() {
return this.runtimes;
}
/**
* {@inheritDoc}
*/
@Override
public boolean belongsTo(Object family) {
return CONTENT_FAMILY == family;
}
protected void copyDirectoryContent(File from, File to) {
for (File file : from.listFiles()) {
if (file.isFile()) {
String fileName = file.getName();
File newFile = new File(to, fileName);
try {
newFile.createNewFile();
FileCopyUtils.copy(file, newFile);
} catch (IOException e) {
}
}
}
}
protected void copyDownloadedArtifactsIntoServer(File bundlesFile, File libraryFile) {
for (IRuntime runtime : this.runtimes) {
VirgoServerRuntime serverRuntime = (VirgoServerRuntime) runtime.loadAdapter(VirgoServerRuntime.class, new NullProgressMonitor());
copyDirectoryContent(bundlesFile, new File(serverRuntime.getUserLevelBundleRepositoryPath()));
copyDirectoryContent(libraryFile, new File(serverRuntime.getUserLevelLibraryRepositoryPath()));
}
}
@Override
protected IStatus run(IProgressMonitor monitor) {
if (this.downloadSources) {
monitor.beginTask("Downloading selected bundles and libraries", this.artifactsToDownload.size() * 2);
} else {
monitor.beginTask("Downloading selected bundles and libraries", this.artifactsToDownload.size());
}
IPath outputPath = ServerCorePlugin.getDefault().getStateLocation().append("repository-downloads-" + System.currentTimeMillis());
File bundlesFile = outputPath.append("bundles").toFile();
if (!bundlesFile.exists()) {
bundlesFile.mkdirs();
}
File libraryFile = outputPath.append("libraries").toFile();
if (!libraryFile.exists()) {
libraryFile.mkdirs();
}
for (Artefact artifact : this.artifactsToDownload) {
if (monitor.isCanceled()) {
continue;
}
if (this.downloadBinary) {
downloadBinary(monitor, bundlesFile, libraryFile, artifact);
}
monitor.worked(1);
if (this.downloadSources) {
if (monitor.isCanceled()) {
continue;
}
downloadSource(monitor, bundlesFile, artifact);
monitor.worked(1);
}
}
if (monitor.isCanceled()) {
return Status.OK_STATUS;
}
copyDownloadedArtifactsIntoServer(bundlesFile, libraryFile);
// refresh the local file system cache of bundles and libraries
for (IRuntime runtime : this.runtimes) {
ServerCorePlugin.getArtefactRepositoryManager().refreshBundleRepository(runtime);
}
monitor.done();
return Status.OK_STATUS;
}
protected void downloadBinary(IProgressMonitor monitor, File bundlesFile, File libraryFile, IArtefactTyped artifact) {
if (artifact instanceof BundleArtefact) {
WebDownloadUtils.downloadFile(RepositoryUtils.getResourceUrl((BundleArtefact) artifact, RepositoryUtils.DOWNLOAD_TYPE_BINARY),
bundlesFile, monitor);
} else {
WebDownloadUtils.downloadFile(RepositoryUtils.getResourceUrl((LibraryArtefact) artifact, RepositoryUtils.DOWNLOAD_TYPE_LIBRARY),
libraryFile, monitor);
}
}
protected void downloadSource(IProgressMonitor monitor, File bundlesFile, Artefact artifact) {
if (artifact instanceof BundleArtefact && artifact.isSourceAvailable()) {
WebDownloadUtils.downloadFile(RepositoryUtils.getResourceUrl((BundleArtefact) artifact, RepositoryUtils.DOWNLOAD_TYPE_SOURCE),
bundlesFile, monitor);
}
}
}