blob: cf55a477d1699ade0dddd8ffce18b95e10a5437d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BestSolution.at 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:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
******************************************************************************/
package org.eclipse.e4.tools.emf.editor3x;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.e4.tools.emf.ui.common.IClassContributionProvider;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.core.search.TypeNameRequestor;
import org.eclipse.pde.internal.core.util.PDEJavaHelper;
public class PDEClassContributionProvider implements IClassContributionProvider {
private SearchEngine searchEngine;
public PDEClassContributionProvider() {
searchEngine = new SearchEngine();
}
@SuppressWarnings("restriction")
public void findContribution(final Filter filter, final ContributionResultHandler handler) {
System.err.println("Searching for: " + filter.namePattern);
IJavaSearchScope scope = PDEJavaHelper.getSearchScope(filter.project);
char[] packageName = null;
char[] typeName = null;
String currentContent = filter.namePattern;
int index = currentContent.lastIndexOf('.');
if (index == -1) {
// There is no package qualification
// Perform the search only on the type name
typeName = currentContent.toCharArray();
} else if ((index + 1) == currentContent.length()) {
// There is a package qualification and the last character is a
// dot
// Perform the search for all types under the given package
// Pattern for all types
typeName = "".toCharArray(); //$NON-NLS-1$
// Package name without the trailing dot
packageName = currentContent.substring(0, index).toCharArray();
} else {
// There is a package qualification, followed by a dot, and
// a type fragment
// Type name without the package qualification
typeName = currentContent.substring(index + 1).toCharArray();
// Package name without the trailing dot
packageName = currentContent.substring(0, index).toCharArray();
}
// char[] packageName = "at.bestsolution.e4.handlers".toCharArray();
// char[] typeName = "*".toCharArray();
TypeNameRequestor req = new TypeNameRequestor() {
public void acceptType(int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) {
// Accept search results from the JDT SearchEngine
String cName = new String(simpleTypeName);
String pName = new String(packageName);
// String label = cName + " - " + pName; //$NON-NLS-1$
String content = pName + "." + cName; //$NON-NLS-1$
// System.err.println("Found: " + label + " => " + pName + " => " + path);
IResource resource = filter.project.getWorkspace().getRoot().findMember(path);
if( resource != null ) {
IProject project = resource.getProject();
IFile f = project.getFile("/META-INF/MANIFEST.MF");
if( f != null && f.exists() ) {
BufferedReader r = null;
try {
InputStream s = f.getContents();
r = new BufferedReader(new InputStreamReader(s));
String line;
while( (line = r.readLine()) != null ) {
if( line.startsWith("Bundle-SymbolicName:") ) {
int start = line.indexOf(':');
int end = line.indexOf(';');
if( end == -1 ) {
end = line.length();
}
ContributionData data = new ContributionData(line.substring(start+1,end).trim(), content, "Java", null);
handler.result(data);
break;
}
}
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if( r != null ) {
try {
r.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
//Image image = (Flags.isInterface(modifiers)) ? PDEPluginImages.get(PDEPluginImages.OBJ_DESC_GENERATE_INTERFACE) : PDEPluginImages.get(PDEPluginImages.OBJ_DESC_GENERATE_CLASS);
//addProposalToCollection(c, startOffset, length, label, content, image);
}
};
try {
searchEngine.searchAllTypeNames(
packageName,
SearchPattern.R_EXACT_MATCH,
typeName,
SearchPattern.R_PREFIX_MATCH,
IJavaSearchConstants.CLASS,
scope,
req,
IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null);
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}