blob: 0ae65d5695f5da769fc2f57b0cef931481a2064d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.dialogs.types.xsd;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.wst.common.core.search.SearchEngine;
import org.eclipse.wst.common.core.search.SearchMatch;
import org.eclipse.wst.common.core.search.SearchParticipant;
import org.eclipse.wst.common.core.search.SearchPlugin;
import org.eclipse.wst.common.core.search.pattern.QualifiedName;
import org.eclipse.wst.common.core.search.pattern.SearchPattern;
import org.eclipse.wst.common.core.search.scope.ProjectSearchScope;
import org.eclipse.wst.common.core.search.scope.SearchScope;
import org.eclipse.wst.common.core.search.scope.WorkspaceSearchScope;
import org.eclipse.wst.common.core.search.util.CollectingSearchRequestor;
import org.eclipse.wst.xml.core.internal.search.XMLComponentDeclarationPattern;
import org.eclipse.wst.xsd.ui.internal.dialogs.types.xml.XMLComponentFinder;
import org.eclipse.wst.xsd.ui.internal.dialogs.types.xml.XMLComponentSpecification;
import org.eclipse.wst.xsd.ui.internal.search.IXSDSearchConstants;
public class XSDComponentFinder extends XMLComponentFinder {
public XSDComponentFinder() {
}
protected void findTypes(SearchEngine searchEngine, List list, int scope, QualifiedName metaName)
{
SearchScope searchScope = new WorkspaceSearchScope();
if (scope == ENCLOSING_PROJECT_SCOPE)
{
searchScope = new ProjectSearchScope(currentIFile.getProject().getLocation());
}
try {
CollectingSearchRequestor requestor = new CollectingSearchRequestor();
XMLComponentDeclarationPattern pattern = new XMLComponentDeclarationPattern(new QualifiedName("*", "*"), metaName, SearchPattern.R_PATTERN_MATCH);
SearchParticipant particpant = SearchPlugin.getDefault().getSearchParticipant("org.eclipse.wst.xsd.search.XSDSearchParticipant");
Assert.isNotNull(particpant);
// for now we assume that we only want to include the xsd related participant
// that way we don't get SearchMatches for things withing WSDL files
// TODO... rethink this... since folks should be capable of changing the 'xsd' search participant impl
// without killing this logic
SearchParticipant[] participants = { particpant };
searchEngine.search(pattern, requestor, participants, searchScope, null, new NullProgressMonitor());
for (Iterator i = requestor.getResults().iterator(); i.hasNext(); )
{
SearchMatch match = (SearchMatch)i.next();
XMLComponentSpecification spec = new XMLComponentSpecification(metaName);
spec.setFileLocation(match.getFile().getLocation().toString());
Object o = match.map.get("name");
if (o != null && o instanceof QualifiedName)
{
QualifiedName qualifiedName = (QualifiedName)o;
if (qualifiedName.getLocalName() != null)
{
spec.addAttributeInfo("name", qualifiedName.getLocalName());
spec.setTargetNamespace(qualifiedName.getNamespace());
list.add(spec);
}
}
}
} catch (CoreException e) {
e.printStackTrace();
//status.add(e.getStatus());
}
}
public List getWorkbenchResourceComponents(int scope) {
// TODO... by making this method return a list... we're cutting off any chance provide asynchronous friendly
// behaviour where we populate the list and refresh the dialog after every few updates or seconds
// returning a list makes this an all or nothing deal
//
List list = new ArrayList();
SearchEngine searchEngine = new SearchEngine();
// TODO... we need a way to combine these into a single search!!
// we can make this search 2X faster by doing so
// either we should combine COMPLEX_TYPE_META_NAME and SIMPLE_TYPE_META_NAME into a single TYPE_META_NAME
// or we'll need to introduce a way to 'OR' SearchPatterns ... which may be tricky!
findTypes(searchEngine, list, scope, IXSDSearchConstants.COMPLEX_TYPE_META_NAME);
findTypes(searchEngine, list, scope, IXSDSearchConstants.SIMPLE_TYPE_META_NAME);
return list;
}
}