/*******************************************************************************
* Copyright (c) 2013 Red Hat Inc. 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:
* Neil Guzman - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.createrepo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.osgi.framework.FrameworkUtil;
/**
* This class will contain the current project and basic operations of the
* createrepo command.
*/
public class CreaterepoProject {
private IEclipsePreferences projectPreferences;
private IProject project;
private IFolder content;
private IFile repoFile;
private IProgressMonitor monitor;
/**
* Constructor without repo file.
*
* @param project The project.
* @throws CoreException Thrown when unable to initialize project.
*/
public CreaterepoProject(IProject project) throws CoreException {
this(project, null);
}
/**
* Default constructor.
*
* @param project The project.
* @throws CoreException Thrown when unable to initialize project.
*/
public CreaterepoProject(IProject project, IFile repoFile) throws CoreException {
this.project = project;
this.repoFile = repoFile;
monitor = new NullProgressMonitor();
projectPreferences = new ProjectScope(project.getProject()).getNode(Activator.PLUGIN_ID);
intitialize();
// if something is deleted from the project while outside of eclipse,
// the tree/preferences will be updated accordingly after refreshing
getProject().refreshLocal(IResource.DEPTH_ONE, monitor);
}
/**
* Initialize the createrepo project by creating the content folder if it doesn't
* yet exist.
*
* @throws CoreException Thrown when unable to create the folders.
*/
private void intitialize() throws CoreException {
content = getProject().getFolder(ICreaterepoConstants.CONTENT_FOLDER);
if (repoFile == null) {
for (IResource child : getProject().members()) {
String extension = child.getFileExtension();
if (extension != null && extension.equals(ICreaterepoConstants.REPO_FILE_EXTENSION)) {
// assumes that there will only be 1 .repo file in the folder
repoFile = (IFile) child;
}
// if no repo file then keep it null
}
}
}
/**
* Create the content folder if it doesn't exist.
*
* @throws CoreException
*/
private void createContentFolder() throws CoreException {
content = getProject().getFolder(ICreaterepoConstants.CONTENT_FOLDER);
if (!content.exists()) {
content.create(true, true, monitor);
}
}
/**
* Import an RPM file outside of the eclipse workspace.
*
* @param externalFile The external file to import.
* @throws CoreException Thrown when failure to create a workspace file.
*/
public void importRPM(File externalFile) throws CoreException {
// must first check if external file exists
if (!externalFile.exists()) {
return;
}
// must put imported RPMs into the content folder; create if missing
if (!getContentFolder().exists()) {
createContentFolder();
}
IFile file = getContentFolder().getFile(new Path(externalFile.getName()));
// do not import non-RPMs
if (!file.getFileExtension().equals(ICreaterepoConstants.RPM_FILE_EXTENSION)) {
return;
}
if (!file.exists()) {
try {
file.create(new FileInputStream(externalFile), false, monitor);
} catch (FileNotFoundException e) {
IStatus status = new Status(
IStatus.ERROR,
FrameworkUtil.getBundle(CreaterepoProject.class).getSymbolicName(),
Messages.CreaterepoProject_errorGettingFile, null);
throw new CoreException(status);
}
getProject().refreshLocal(IResource.DEPTH_INFINITE, monitor);
}
}
/**
* Execute the createrepo command.
*
* @param os Direct execution stream to this.
* @return The status of the execution.
* @throws CoreException Thrown when failure to execute command.
*/
public IStatus createrepo(OutputStream os) throws CoreException {
if (!getContentFolder().exists()) {
createContentFolder();
}
Createrepo createrepo = new Createrepo();
IStatus result = createrepo.execute(os, this, getCommandArguments());
getProject().refreshLocal(IResource.DEPTH_INFINITE, monitor);
return result;
}
/**
* Execute the createrepo command with a call to update.
*
* @param os Direct execution stream to this.
* @return The status of the execution.
* @throws CoreException Thrown when failure to execute command.
*/
public IStatus update(OutputStream os) throws CoreException {
if (!getContentFolder().exists()) {
createContentFolder();
}
Createrepo createrepo = new Createrepo();
List<String> commands = getCommandArguments();
commands.add(ICreaterepoConstants.DASH.concat(CreaterepoPreferenceConstants.PREF_UPDATE));
IStatus result = createrepo.execute(os, this, commands);
getProject().refreshLocal(IResource.DEPTH_INFINITE, monitor);
return result;
}
/**
* Get the project.
*
* @return The project.
*/
public IProject getProject() {
return project;
}
/**
* Get the content folder.
*
* @return The content folder.
*/
public IFolder getContentFolder() {
return content;
}
/**
* Get the .repo file.
*
* @return The .repo file.
*/
public IFile getRepoFile() {
return repoFile;
}
/**
* Get the RPMs in the project.
*
* @return A list of RPMs located within the project.
* @throws CoreException Thrown when unable to look into the project.
*/
public List<IResource> getRPMs() throws CoreException {
List<IResource> rpms = new ArrayList<>();
if (!getContentFolder().exists()) {
return rpms;
}
if (getProject().members().length > 0) {
for (IResource child : getContentFolder().members()) {
String extension = child.getFileExtension();
if (extension != null && extension.equals(ICreaterepoConstants.RPM_FILE_EXTENSION)) {
rpms.add(child);
}
}
}
return rpms;
}
/**
* Get the eclipse preferences of this project.
*
* @return The eclipse preferences for the project.
*/
public IEclipsePreferences getEclipsePreferences() {
return projectPreferences;
}
/**
* Get the command arguments to pass to the createrepo command. The
* arguments come from the stored preferences from the preference page
* and the project preferences.
*
* @return The command arguments.
*/
private List<String> getCommandArguments() {
List<String> commands = new ArrayList<>();
CreaterepoCommandCreator creator = new CreaterepoCommandCreator(projectPreferences);
commands.addAll(creator.getCommands());
return commands;
}
}