package org.activiti.designer.eclipse.deployment;
import java.util.ArrayList;
import java.util.Iterator;
import org.activiti.designer.eclipse.Logger;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Control;
public class IncludeClassesTreeContentProvider implements ITreeContentProvider {
public Object[] getElements(Object parent) {
if (parent instanceof IJavaProject) {
return getPackageFragmentRoots((IJavaProject)parent);
}
return new Object[0];
}
private IPackageFragmentRoot[] getPackageFragmentRoots(IJavaProject project) {
try {
ArrayList<IPackageFragmentRoot> list = new ArrayList<IPackageFragmentRoot>();
IClasspathEntry[] entries = project.getRawClasspath();
for (int i = 0; i < entries.length; i++) {
if (entries[i].getEntryKind() != IClasspathEntry.CPE_CONTAINER && entries[i].getEntryKind() != IClasspathEntry.CPE_VARIABLE) {
IPackageFragmentRoot[] roots = project.findPackageFragmentRoots(entries[i]);
for (int j = 0; j < roots.length; j++) {
list.add(roots[j]);
}
}
}
Iterator<IPackageFragmentRoot> itPackage = list.iterator();
while(itPackage.hasNext()) {
IPackageFragmentRoot packageRoot = itPackage.next();
if(packageRoot.getPath().toOSString().contains("src/test")) {
itPackage.remove();
}
}
return (IPackageFragmentRoot[])list.toArray(new IPackageFragmentRoot[list.size()]);
}
catch (JavaModelException e) {
Logger.logError(e);
}
return new IPackageFragmentRoot[0];
}
public Object[] getChildren(Object parent) {
ArrayList list = new ArrayList();
try {
if (parent instanceof IPackageFragmentRoot) {
list.addAll(toArrayList(((IPackageFragmentRoot)parent).getNonJavaResources()));
list.addAll(getNonEmptyPackageFragments((IPackageFragmentRoot) parent));
} else if (parent instanceof IPackageFragment) {
list.addAll(toArrayList(((IPackageFragment)parent).getNonJavaResources()));
list.addAll(toArrayList(((IPackageFragment)parent).getChildren()));
}
} catch (JavaModelException e) {
Logger.logError(e);
}
return list.toArray();
}
private ArrayList toArrayList(Object[] resources){
ArrayList list = new ArrayList();
for (int i = 0; i < resources.length; i++) {
list.add(resources[i]);
}
return list;
}
private ArrayList getNonEmptyPackageFragments(IPackageFragmentRoot parent) {
ArrayList list = new ArrayList();
try {
Object[] children = parent.getChildren();
for (int i = 0; i < children.length; i++) {
if (children[i] instanceof IPackageFragment && hasChildren(children, i)) {
list.add(children[i]);
}
}
} catch (JavaModelException e) {
Logger.logError(e);
}
return list;
}
private boolean hasChildren(Object[] children, int i) throws JavaModelException {
return (((IPackageFragment)children[i]).getChildren().length != 0)
|| (((IPackageFragment)children[i]).getNonJavaResources().length != 0);
}
public Object getParent(Object element) {
if (element == null) {
return null;
} else if (element instanceof IJavaElement) {
return ((IJavaElement)element).getParent();
} else if (element instanceof IResource) {
IJavaElement javaElement = JavaCore.create(((IResource) element).getParent());
if (javaElement != null) {
return javaElement;
} else {
return ((IResource)element).getParent();
}
}
return null;
}
public boolean hasChildren(Object element) {
if (element instanceof IPackageFragmentRoot) {
return getChildren(element).length > 0;
} else if (element instanceof IPackageFragment) {
return getChildren(element).length > 0;
}
return false;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
asyncRefresh(viewer);
}
private void asyncRefresh(final Viewer viewer) {
Control control = viewer.getControl();
if (!control.isDisposed()) {
control.getDisplay().asyncExec(new Runnable() {
public void run() {
if (!viewer.getControl().isDisposed()) {
viewer.refresh();
}
}
});
}
}
}