package rhogenwizard.project;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import rhogenwizard.Activator;
import rhogenwizard.BuildInfoHolder;
import rhogenwizard.project.extension.BadProjectTagException;
import rhogenwizard.project.extension.ProjectNotFoundException;
public class ProjectFactory implements IProjectFactory
{
private static ProjectFactory factoryInstance = null;
public static IProjectFactory getInstance()
{
if (factoryInstance == null)
factoryInstance = new ProjectFactory();
return (IProjectFactory) factoryInstance;
}
public IPath getWorkspaceDir()
{
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
IPath location = root.getLocation();
return location;
}
/**
* Just do the basics: create a basic project.
*
* @param location
* @param projectName
* @throws CoreException
*/
private IProject createBaseProject(BuildInfoHolder projectInfo) throws CoreException
{
// it is acceptable to use the ResourcesPlugin class
IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectInfo.appName);
if (newProject.exists())
{
throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
"Project " + projectInfo.appName + " already exists."));
}
IProjectDescription desc = newProject.getWorkspace().newProjectDescription(newProject.getName());
if (!projectInfo.isInDefaultWs)
{
if (projectInfo.existCreate && !isProjectLocationInWorkspace(projectInfo.appDir))
{
desc.setLocation(projectInfo.getAppDirPath());
}
else if (!projectInfo.existCreate)
{
desc.setLocation(projectInfo.getAppDirPath());
}
}
newProject.create(desc, new NullProgressMonitor());
if (!newProject.isOpen())
{
newProject.open(new NullProgressMonitor());
}
return newProject;
}
private IRhomobileProject createRhomobileProject(Class<? extends IRhomobileProject> projectTag, IProject project) throws BadProjectTagException
{
if (projectTag.equals(RhodesProject.class))
{
return new RhodesProject(project);
}
else if (projectTag.equals(RhoconnectProject.class))
{
return new RhoconnectProject(project);
}
else if (projectTag.equals(RhoelementsProject.class))
{
return new RhoelementsProject(project);
}
throw new BadProjectTagException(projectTag);
}
public boolean isProjectLocationInWorkspace(final String projectPath)
{
String wsPath = getWorkspaceDir().toOSString();
return projectPath.toLowerCase().contains(wsPath.toLowerCase());
}
public IRhomobileProject createProject(Class<? extends IRhomobileProject> projectTag, BuildInfoHolder projectInfo)
throws CoreException, ProjectNotFoundException, BadProjectTagException
{
Assert.isNotNull(projectInfo.appName);
Assert.isTrue(projectInfo.appName.trim().length() != 0);
IProject project = createBaseProject(projectInfo);
IRhomobileProject rhoProject = createRhomobileProject(projectTag, project);
rhoProject.addNature();
return rhoProject;
}
@Override
public IProject getSelectedProject()
{
IProject project = null;
IWorkbenchWindow[] workbenchWindows = PlatformUI.getWorkbench().getWorkbenchWindows();
if (workbenchWindows.length > 0)
{
IWorkbenchPage page = workbenchWindows[0].getActivePage();
ISelection selection = page.getSelection();
if (selection instanceof IStructuredSelection)
{
IStructuredSelection sel = (IStructuredSelection) selection;
Object res = sel.getFirstElement();
if (res instanceof IResource)
{
project = ((IResource)res).getProject();
}
}
}
return project;
}
@Override
public IRhomobileProject convertFromProject(IProject project) throws BadProjectTagException
{
if (RhodesProject.checkNature(project))
{
return createRhomobileProject(RhodesProject.class, project);
}
else if (RhoconnectProject.checkNature(project))
{
return createRhomobileProject(RhoconnectProject.class, project);
}
else if (RhoelementsProject.checkNature(project))
{
return createRhomobileProject(RhoelementsProject.class, project);
}
throw new BadProjectTagException(IProject.class);
}
@Override
public Class<?> typeFromProject(IProject project) throws BadProjectTagException
{
if (RhodesProject.checkNature(project))
{
return RhodesProject.class;
}
else if (RhoconnectProject.checkNature(project))
{
return RhoconnectProject.class;
}
else if (RhoelementsProject.checkNature(project))
{
return RhoelementsProject.class;
}
throw new BadProjectTagException(IProject.class);
}
}