/**
* Copyright (c) 2009-2010 MATSUFUJI Hideharu <matsufuji2008@gmail.com>,
* 2010-2013 KUBO Atsuhiro <kubo@iteman.jp>,
* All rights reserved.
*
* This file is part of MakeGood.
*
* 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
*/
package com.piece_framework.makegood.launch;
import java.util.ArrayList;
import java.util.Collections;
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.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Status;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ModelException;
import com.piece_framework.makegood.core.Resource;
public class TestTargets {
private List<Object> testTargets = new ArrayList<Object>();
/**
* @since 1.3.0
*/
private IProject project;
public void add(Object testTarget) throws ResourceNotFoundException, ProjectNotFoundException, ModelException {
testTargets.add(testTarget);
if (getCount() == 1) {
IResource resource = getFirstResource();
if (resource == null) {
throw new ResourceNotFoundException("The resource is not found. The given target may be invalid."); //$NON-NLS-1$
}
IProject project = resource.getProject();
if (project == null) {
throw new ProjectNotFoundException("The project is not found. The given resource may be the workspace root."); //$NON-NLS-1$
}
this.project = project;
}
if (testTarget instanceof ISourceModule) {
for (IType type: ((ISourceModule) testTarget).getAllTypes()) {
testTargets.add(type);
}
}
}
public String getMainScript() {
IFile file = null;
IResource resource = getFirstResource();
if (resource instanceof IFolder) {
file = findDummyFile((IFolder) resource);
} else if (resource instanceof IFile) {
file = (IFile) resource;
}
if (file == null) return null;
return file.getFullPath().toString();
}
public IResource getMainScriptResource() {
String mainScript = getMainScript();
if (mainScript == null) return null;
return ResourcesPlugin.getWorkspace().getRoot().findMember(mainScript);
}
private IFile findDummyFile(IFolder folder) {
try {
for (IResource resource: folder.members()) {
if (new Resource(resource).isPHPFile()) {
return (IFile) resource;
}
}
for (IResource resource: folder.members()) {
if (resource instanceof IFolder) {
IFile file = findDummyFile((IFolder) resource);
if (file != null) {
return file;
}
}
}
} catch (CoreException e) {
Activator.getDefault().getLog().log(
new Status(
Status.WARNING,
Activator.PLUGIN_ID,
e.getMessage(),
e
)
);
}
return null;
}
IResource getResource(Object testTarget) {
IResource resource = null;
if (testTarget instanceof IModelElement) {
resource = ((IModelElement) testTarget).getResource();
} else if (testTarget instanceof IResource) {
resource = (IResource) testTarget;
} else if (testTarget instanceof ClassTestTarget) {
resource = ((ClassTestTarget) testTarget).getResource();
}
return resource;
}
IResource getFirstResource() {
if (getCount() == 0) return null;
return getResource(testTargets.get(0));
}
/**
* @since 1.3.0
*/
public IProject getProject() {
return project;
}
/**
* @since 1.3.0
*/
public int getCount() {
return testTargets.size();
}
/**
* @since 2.5.0
*/
public List<Object> getAll() {
return Collections.unmodifiableList(testTargets);
}
}