/*******************************************************************************
* 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.form.tests;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.linuxtools.internal.rpm.createrepo.Activator;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoProject;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoProjectNature;
import org.eclipse.linuxtools.internal.rpm.createrepo.ICreaterepoConstants;
import org.eclipse.linuxtools.internal.rpm.createrepo.IRepoFileConstants;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
/**
* A class to create a test createrepo project. This will create the repo file
* and content folder without having to go through the project wizard. It also
* initializes the project nature and initializes the repo file's contents to
* being empty.
*/
public class TestCreaterepoProject {
private static NullProgressMonitor monitor;
private IProject project;
/**
* Instantiating class creates project, content folder, and .repo file.
*
* @throws CoreException
*/
public TestCreaterepoProject() throws CoreException {
monitor = new NullProgressMonitor();
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
project = root.getProject(ICreaterepoTestConstants.PROJECT_NAME);
IProjectDescription description = ResourcesPlugin.getWorkspace()
.newProjectDescription(ICreaterepoTestConstants.PROJECT_NAME);
description.setNatureIds(new String[] {CreaterepoProjectNature.CREATEREPO_NATURE_ID});
if (!project.exists()) {
project.create(description, monitor);
}
project.open(monitor);
init();
}
/**
* Create the content folder and the .repo file.
*
* @throws CoreException
*/
private void init() throws CoreException {
createFolder(ICreaterepoConstants.CONTENT_FOLDER);
createFile(ICreaterepoTestConstants.REPO_NAME);
}
/**
* Create a folder in the project.
*
* @param folderName The name of the folder.
* @return The folder that was created.
* @throws CoreException
*/
public IFolder createFolder(String folderName) throws CoreException {
IFolder folder = project.getFolder(folderName);
if (!folder.exists()) {
folder.create(false, true, monitor);
}
return folder;
}
/**
* Create a file in the project. Initialize empty content.
*
* @param fileName The name of the file.
* @return The file that was created.
* @throws CoreException
*/
public IFile createFile(String fileName) throws CoreException {
IFile file = project.getFile(fileName);
InputStream stream = new ByteArrayInputStream(ICreaterepoConstants.EMPTY_STRING.getBytes());
if (!file.exists()) {
file.create(stream, true, monitor);
}
return file;
}
/**
* Delete the project and all its contents.
*
* @throws CoreException
*/
public void dispose() throws CoreException {
project.delete(true, true, monitor);
}
/**
* Refresh the project.
*
* @throws CoreException
*/
public void refresh() throws CoreException {
project.refreshLocal(IResource.DEPTH_INFINITE, null);
}
/**
* Return a new instance of a CreaterepoProject.
*
* @return A new CreaterepoProject.
* @throws CoreException
*/
public CreaterepoProject getCreaterepoProject() throws CoreException {
return new CreaterepoProject(project, project.getFile(ICreaterepoTestConstants.REPO_NAME));
}
/**
* Return the current project instance;
*
* @return The current project instance.
*/
public IProject getProject() {
return project;
}
/**
* Set the file contents of the repofile if it exists, or create a repofile
* with the specified contents if it does not exist.
*
* @param id The repository ID.
* @param name The human-readable description of the repository.
* @param url The baseurl of the repository.
* @throws CoreException
*/
public void setRepoFileContents(String id, String name, String url) throws CoreException {
String contents = String.format("[%s]\n", id); //$NON-NLS-1$
contents = contents.concat(String.format("%s=%s\n", IRepoFileConstants.NAME, name)); //$NON-NLS-1$
contents = contents.concat(String.format("%s=%s\n", IRepoFileConstants.BASE_URL, url)); //$NON-NLS-1$
InputStream stream = new ByteArrayInputStream(contents.getBytes());
IFile repoFile = project.getFile(ICreaterepoTestConstants.REPO_NAME);
if (repoFile.exists()) {
repoFile.setContents(stream, true, true, monitor);
} else {
repoFile.create(stream, true, monitor);
}
}
/**
* Restore the defaults of the workspace preferences.
*/
public void restoreDefaults() {
IPreferenceStore prefStore = new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID);
for (String preference : ICreaterepoTestConstants.PREFS_ARRAY) {
prefStore.setToDefault(preference);
}
}
}