/************************************************************************************* * Copyright (c) 2008-2012 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: * JBoss by Red Hat - Initial implementation. ************************************************************************************/ package org.jboss.tools.arquillian.ui.internal.dialogs; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import org.apache.maven.model.Build; import org.apache.maven.project.MavenProject; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; 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.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.ICompilationUnit; 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.IType; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.m2e.core.MavenPlugin; import org.eclipse.m2e.core.internal.IMavenConstants; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog; import org.jboss.tools.arquillian.ui.ArquillianUIActivator; import org.jboss.tools.arquillian.ui.internal.wizards.TypeLabelProvider; /** * * @author snjeza * */ public class ArquillianTypesSelectionDialog extends FilteredItemsSelectionDialog { private static final String DIALOG_SETTINGS = "org.jboss.tools.arquillian.ui.ArquillianTypesSelectionDialog"; //$NON-NLS-1$ private IJavaProject javaProject; private List<IType> allTypes; private List<IType> addedTypes; public ArquillianTypesSelectionDialog(Shell shell, IJavaProject javaProject, List<IType> addedTypes) { super(shell, true); this.javaProject = javaProject; setTitle("Classes selection"); setMessage("Select classes:"); setListLabelProvider(new TypeLabelProvider()); this.addedTypes = addedTypes; } @Override protected Control createExtendedContentArea(Composite parent) { return null; } @Override protected IDialogSettings getDialogSettings() { IDialogSettings settings = ArquillianUIActivator.getDefault().getDialogSettings().getSection(DIALOG_SETTINGS); if (settings == null) { settings = ArquillianUIActivator.getDefault().getDialogSettings().addNewSection(DIALOG_SETTINGS); } return settings; } @Override protected IStatus validateItem(Object item) { return new Status(IStatus.OK, ArquillianUIActivator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$ } @Override protected ItemsFilter createFilter() { return new TypesSearchItemsFilter(); } @Override protected Comparator getItemsComparator() { return new TypesSearchComparator(); } @Override protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException { getClasses(); for (IType type:allTypes) { contentProvider.add(type, itemsFilter); progressMonitor.worked(1); } progressMonitor.done(); } @Override public String getElementName(Object item) { if (item instanceof IType) { return ((IType)item).getFullyQualifiedName(); } return null; } private void getClasses() { allTypes = new ArrayList<IType>(); if (javaProject != null && javaProject.isOpen()) { IPath testSourcePath = null; try { IProject project = javaProject.getProject(); if (project.hasNature(IMavenConstants.NATURE_ID)) { IFile pomFile = project.getFile(IMavenConstants.POM_FILE_NAME); MavenProject mavenProject = MavenPlugin.getMaven().readProject( pomFile.getLocation().toFile(), new NullProgressMonitor()); Build build = mavenProject.getBuild(); String testSourceDirectory = build.getTestSourceDirectory(); testSourcePath = Path.fromOSString(testSourceDirectory); IPath workspacePath = ResourcesPlugin.getWorkspace().getRoot().getRawLocation(); testSourcePath = testSourcePath.makeRelativeTo(workspacePath).makeAbsolute(); } IClasspathEntry[] rawClasspath = javaProject.getRawClasspath(); for (IClasspathEntry entry : rawClasspath) { if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) { IPackageFragmentRoot[] roots = javaProject .findPackageFragmentRoots(entry); if (roots == null) { continue; } for (IPackageFragmentRoot root : roots) { IPath path = root.getPath(); String projectLocation = project.getLocation().toOSString(); IPath projectPath = Path.fromOSString(projectLocation); IPath workspacePath = ResourcesPlugin.getWorkspace().getRoot().getRawLocation(); projectPath = projectPath.makeRelativeTo(workspacePath).makeAbsolute(); projectPath = projectPath.removeLastSegments(1); path = projectPath.append(path); if (path != null && path.equals(testSourcePath)) { continue; } IJavaElement[] children = root.getChildren(); for (IJavaElement child : children) { if (child instanceof IPackageFragment) { IPackageFragment packageFragment = (IPackageFragment) child; IJavaElement[] elements = packageFragment .getChildren(); for (IJavaElement element : elements) { if (element instanceof ICompilationUnit) { ICompilationUnit cu = (ICompilationUnit) element; IType[] types = cu.getTypes(); for (IType type : types) { if (!addedTypes.contains(type)) { allTypes.add(type); } } } } } } } } } } catch (Exception e1) { ArquillianUIActivator.log(e1); } } } private class TypesSearchItemsFilter extends ItemsFilter { public boolean isConsistentItem(Object item) { return true; } public boolean matchItem(Object item) { String text = null; if (item instanceof IType) { text = ((IType)item).getFullyQualifiedName(); } return (matches(text)); } protected boolean matches(String text) { String pattern = patternMatcher.getPattern(); if (pattern.indexOf("*") != 0 & pattern.indexOf("?") != 0 & pattern.indexOf(".") != 0) {//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ pattern = "*" + pattern; //$NON-NLS-1$ patternMatcher.setPattern(pattern); } return patternMatcher.matches(text); } } private class TypesSearchComparator implements Comparator { public int compare(Object o1, Object o2) { String s1 = getId(o1); String s2 = getId(o2); if (s1 == null && s2 == null) { return 0; } if (s1 == null && s2 != null) { return -1; } return s1.compareTo(s2); } private String getId(Object element) { if (element instanceof IType) { return ((IType)element).getFullyQualifiedName(); } return null; } } }