/******************************************************************************* * Copyright (c) 2005, 2010 Red Hat, Inc. * 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: * Red Hat - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.rpm.core; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.linuxtools.internal.rpm.core.FlatBuildConfiguration; import org.eclipse.linuxtools.internal.rpm.core.Messages; import org.eclipse.linuxtools.internal.rpm.core.RPMBuildConfiguration; import org.eclipse.linuxtools.internal.rpm.core.SpecfileVisitor; import org.eclipse.linuxtools.internal.rpm.core.utils.FileDownloadJob; import org.eclipse.linuxtools.internal.rpm.core.utils.RPM; import org.eclipse.linuxtools.internal.rpm.core.utils.RPMBuild; /** * Basic RPM projects operations handler. * */ public class RPMProject { private IProject project; private IProjectConfiguration rpmConfig; /** * Creates the rpm project for the given IProject and layout. * * @param project The Eclipse project this RPMProject is represented by. * @param projectLayout The layout of the rpm project * @throws CoreException Thrown only in the RPMbuild layout case if a problem with some of the folders exist. */ public RPMProject(IProject project, RPMProjectLayout projectLayout) throws CoreException { this.project = project; switch (projectLayout) { case FLAT: rpmConfig = new FlatBuildConfiguration(this.project); break; case RPMBUILD: default: rpmConfig = new RPMBuildConfiguration(this.project); break; } } /** * Returns the configuration (RPMBuild, FLAT) for this project. * * @return The project configuration. */ public IProjectConfiguration getConfiguration() { return rpmConfig; } /** * Returns the .spec file of this project. * * @return The .spec file or null if one is not found. */ public IResource getSpecFile() { IContainer specsFolder = getConfiguration().getSpecsFolder(); IResource file = null; SpecfileVisitor specVisitor = new SpecfileVisitor(); try { specsFolder.accept(specVisitor); List<IResource> installedSpecs = specVisitor.getSpecFiles(); if(installedSpecs.size() > 0){ file = installedSpecs.get(0); } } catch (CoreException e) { // ignore, failed to find .spec file. } return file; } /** * Import a SRPM into this RPM project using local file. * * @param externalFile The SRPM file. * @throws CoreException If there is problem with the .src.rpm file. */ public void importSourceRPM(File externalFile) throws CoreException { // Copy original SRPM to workspace IFile srpmFile = getConfiguration().getSrpmsFolder().getFile( new Path(externalFile.getName())); try { srpmFile.create(new FileInputStream(externalFile), false, null); } catch (FileNotFoundException e) { String throwMessage = Messages.getString("RPMCore.Error_trying_to_copy__") + //$NON-NLS-1$ rpmConfig.getSpecsFolder().getLocation().toOSString(); IStatus error = new Status(IStatus.ERROR, IRPMConstants.ERROR, 1, throwMessage, e); throw new CoreException(error); } // Install the SRPM RPM rpm = new RPM(getConfiguration()); rpm.install(srpmFile); project.refreshLocal(IResource.DEPTH_INFINITE, null); // Set the project nature RPMProjectNature.addRPMNature(project, null); } /** * Import a remote SRPM into this RPM project, by downloading the file * and calling {@link RPMProject#importSourceRPM(File)}. * * @param remoteFile URI to the remote SRPM file. * @param monitor The progress monitor. * @throws CoreException Thrown if the import failed. */ public void importSourceRPM(URL remoteFile, IProgressMonitor monitor) throws CoreException { URLConnection content; try { content = remoteFile.openConnection(); } catch (IOException e) { Status status = new Status(IStatus.ERROR, IRPMConstants.RPM_CORE_ID, e.getMessage(), e); throw new CoreException(status); } File tempFile = new File( System.getProperty("java.io.tmpdir"), remoteFile.toString().substring(remoteFile.toString().lastIndexOf('/') + 1)); //$NON-NLS-1$ if (tempFile.exists()) { tempFile.delete(); } final FileDownloadJob downloadJob = new FileDownloadJob(tempFile, content); downloadJob.run(monitor); importSourceRPM(tempFile); } /** * Build both source and binary rpms. * @param outStream The stream to right command output to. * @return The result of the command. * @throws CoreException If exception occurs during building. */ public IStatus buildAll(OutputStream outStream) throws CoreException { RPMBuild rpmbuild = new RPMBuild(getConfiguration()); IStatus result = rpmbuild.buildAll(getSpecFile(), outStream); getConfiguration().getBuildFolder().refreshLocal(IResource.DEPTH_INFINITE, null); getConfiguration().getRpmsFolder().refreshLocal(IResource.DEPTH_INFINITE, null); getConfiguration().getSrpmsFolder().refreshLocal(IResource.DEPTH_INFINITE, null); return result; } /** * Builds binary rpm. * @param out The stream to right command output to. * @return The result of the command. * @throws CoreException If exception occurs during building. */ public IStatus buildBinaryRPM(OutputStream out) throws CoreException { RPMBuild rpmbuild = new RPMBuild(getConfiguration()); IStatus result = rpmbuild.buildBinary(getSpecFile(), out); getConfiguration().getBuildFolder().refreshLocal(IResource.DEPTH_INFINITE, null); getConfiguration().getRpmsFolder().refreshLocal(IResource.DEPTH_INFINITE, null); return result; } /** * Builds source rpm. * @param out The stream to right command output to. * @return The result of the command. * @throws CoreException If exception occurs during building. */ public IStatus buildSourceRPM(OutputStream out) throws CoreException { RPMBuild rpmbuild = new RPMBuild(getConfiguration()); IStatus result = rpmbuild.buildSource(getSpecFile(), out); getConfiguration().getBuildFolder().refreshLocal(IResource.DEPTH_INFINITE, null); getConfiguration().getSrpmsFolder().refreshLocal(IResource.DEPTH_INFINITE, null); return result; } /** * Prepares sources for build (rpmbuild -bp). * @param out The stream to right command output to. * @return The result of the command. * @throws CoreException If exception occurs during building. */ public IStatus buildPrep(OutputStream out) throws CoreException { RPMBuild rpmbuild = new RPMBuild(getConfiguration()); IStatus result = rpmbuild.buildPrep(getSpecFile(), out); getConfiguration().getBuildFolder().refreshLocal(IResource.DEPTH_INFINITE, null); return result; } }