/*****************************************************************************
* Copyright (c) 2006, 2007 g-Eclipse Consortium
* 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
*
* Initial development of the original code was made for the
* g-Eclipse project founded by European Union
* project number: FP6-IST-034327 http://www.geclipse.eu/
*
* Contributors:
* Mathias Stuempert - initial API and implementation
*****************************************************************************/
package eu.geclipse.ui.wizards;
import java.lang.reflect.InvocationTargetException;
import java.util.Hashtable;
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.ProjectScope;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
import eu.geclipse.core.model.IVirtualOrganization;
import eu.geclipse.core.project.GridProjectNature;
import eu.geclipse.ui.internal.Activator;
public class GridProjectCreationOperation implements IRunnableWithProgress {
private GridProjectProperties properties;
private IProject gridProject;
public GridProjectCreationOperation( final GridProjectProperties properties ) {
this.properties = properties;
this.gridProject = null;
}
public void run( final IProgressMonitor monitor )
throws InvocationTargetException, InterruptedException {
monitor.beginTask( Messages.getString("GridProjectCreationOperation.create_task"), 300 ); //$NON-NLS-1$
try {
IProject proj = createProject( this.properties, monitor );
addProjectNature( proj, monitor );
this.gridProject = proj;
} catch ( CoreException cExc ) {
eu.geclipse.ui.internal.Activator.logException( cExc );
} finally {
monitor.done();
}
}
public IProject getProject() {
return this.gridProject;
}
private IProject createProject( final GridProjectProperties props,
final IProgressMonitor monitor )
throws CoreException {
monitor.subTask( Messages.getString("GridProjectCreationOperation.init_task") ); //$NON-NLS-1$
String projectName = props.getProjectName();
IPath projectPath = props.getProjectLocation();
IProject[] referencesProjects = props.getReferencesProjects();
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
IProject project = workspaceRoot.getProject( projectName );
IStatus status =
ResourcesPlugin.getWorkspace().validateProjectLocation( project, projectPath );
if ( status.getSeverity() != IStatus.OK ) {
throw new CoreException( status );
}
IProjectDescription desc = project.getWorkspace().newProjectDescription( projectName );
desc.setLocation(projectPath);
if ( referencesProjects != null ) {
desc.setReferencedProjects( referencesProjects );
}
project.create( desc, new SubProgressMonitor( monitor, 50 ) );
project.open( new SubProgressMonitor( monitor, 50 ) );
createProjectStructure( project, props );
setProjectProperties( project, props );
if ( monitor.isCanceled() ) {
throw new OperationCanceledException();
}
return project;
}
private void addProjectNature( final IProject proj, final IProgressMonitor monitor ) throws CoreException {
monitor.subTask( Messages.getString("GridProjectCreationOperation.nature_task") ); //$NON-NLS-1$
IProjectDescription desc = proj.getDescription();
String[] natureIDs = desc.getNatureIds();
String gridNatureID = GridProjectNature.getID();
boolean found = false;
for ( int i = 0 ; ( i < natureIDs.length ) && ( !found ) ; i++ ) {
if ( natureIDs[i].equals( gridNatureID ) ) {
found = true;
}
}
if ( !found ) {
String[] newNatureIDs = new String[ natureIDs.length +1 ];
System.arraycopy( natureIDs, 0, newNatureIDs, 1, natureIDs.length );
newNatureIDs[0] = gridNatureID;
desc.setNatureIds( newNatureIDs );
proj.setDescription( desc, new SubProgressMonitor( monitor, 100 ) );
}
if ( monitor.isCanceled() ) {
throw new OperationCanceledException();
}
}
private void createProjectFolder( final IProject project,
final String name ) {
if ( ( name != null ) && ( name.length() != 0 ) ) {
IFolder folder = project.getFolder( new Path( name ) );
if ( !folder.exists() ) {
try {
folder.create( IResource.FORCE, true, null );
} catch( CoreException cExc ) {
Activator.logException( cExc );
}
}
}
}
private void createProjectStructure( final IProject project,
final GridProjectProperties props ) {
Hashtable< String, String > projectFolders = props.getProjectFolders();
for ( String label : projectFolders.values() ) {
createProjectFolder( project, label );
}
}
private void setProjectProperties( final IProject project,
final GridProjectProperties props )
throws CoreException {
IVirtualOrganization projectVo = props.getProjectVo();
String voName = projectVo.getName();
Hashtable< String, String > folders = props.getProjectFolders();
IScopeContext projectScope = new ProjectScope( project );
try {
Preferences projectNode = projectScope.getNode( "eu.geclipse.core" ); //$NON-NLS-1$
projectNode.put( "vo", voName ); //$NON-NLS-1$
projectNode.flush();
Preferences folderNode = projectScope.getNode( "eu.geclipse.core.folders" ); //$NON-NLS-1$
for ( String id : folders.keySet() ) {
String label = folders.get( id );
folderNode.put( id, label );
}
folderNode.flush();
} catch( BackingStoreException bsExc ) {
IStatus status = new Status( IStatus.ERROR,
Activator.PLUGIN_ID,
IStatus.CANCEL,
Messages.getString("GridProjectCreationOperation.set_preferences_failed"), //$NON-NLS-1$
bsExc );
throw new CoreException( status );
}
}
}