/**
* Copyright (c) 2010, 2012 Cloudsmith Inc. and other contributors, as listed below.
* 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:
* Itemis AG http://www.itemis.eu - initial API and implementation
* Cloudsmith - specialization to puppet
*
*/
package org.cloudsmith.geppetto.pp.dsl.ui.search;
import java.util.Collection;
import org.cloudsmith.geppetto.pp.PPPackage;
import org.cloudsmith.geppetto.pp.pptp.PPTPPackage;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.ui.dialogs.SearchPattern;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.IResourceDescription;
import org.eclipse.xtext.resource.IResourceDescriptions;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
@ImplementedBy(IPPEObjectSearch.Default.class)
public interface IPPEObjectSearch {
public static class Default implements IPPEObjectSearch {
@Inject
private IResourceDescriptions resourceDescriptions;
@Inject
private IQualifiedNameConverter qualifiedNameConverter;
public Iterable<IEObjectDescription> findMatches(final String searchPattern,
final Collection<EClass> acceptedClasses) {
return Iterables.filter(getSearchScope(), getSearchPredicate(searchPattern, acceptedClasses));
}
public IResourceDescriptions getResourceDescriptions() {
return resourceDescriptions;
}
protected Predicate<IEObjectDescription> getSearchPredicate(final String stringPattern,
final Collection<EClass> acceptedClasses) {
final SearchPattern searchPattern = new SearchPattern();
searchPattern.setPattern(stringPattern);
return new Predicate<IEObjectDescription>() {
public boolean apply(IEObjectDescription input) {
if(isNameMatches(searchPattern, input) && isClassAccepted(input, acceptedClasses)) {
return true;
}
return false;
}
};
}
protected Iterable<IEObjectDescription> getSearchScope() {
return Iterables.concat(Iterables.transform(
getResourceDescriptions().getAllResourceDescriptions(),
new Function<IResourceDescription, Iterable<IEObjectDescription>>() {
public Iterable<IEObjectDescription> apply(IResourceDescription from) {
return from.getExportedObjects();
}
}));
}
protected boolean isAcceptedByPP(IEObjectDescription od) {
switch(od.getEClass().getClassifierID()) {
case PPPackage.HOST_CLASS_DEFINITION:
case PPPackage.DEFINITION:
case PPPackage.DEFINITION_ARGUMENT:
case PPPackage.VARIABLE_EXPRESSION:
case PPPackage.NODE_DEFINITION:
return true;
}
return false;
}
protected boolean isAcceptedByPPTP(IEObjectDescription od) {
// Contributions from .pptp files are not meaningful to open
String path = od.getEObjectURI().path();
if(path != null && path.endsWith(".pptp"))
return false;
// all other are ok (i.e. typically from .rb)
// Only included those that are meaningful for user to open
switch(od.getEClass().getClassifierID()) {
case PPTPPackage.TYPE:
case PPTPPackage.FUNCTION:
case PPTPPackage.PARAMETER:
case PPTPPackage.PROPERTY:
case PPTPPackage.META_TYPE:
case PPTPPackage.META_VARIABLE:
return true;
}
return false;
}
protected boolean isClassAccepted(IEObjectDescription od, Collection<EClass> acceptedClasses) {
EClass eclass = od.getEClass();
EPackage epackage = eclass.getEPackage();
// user supplied filter
if(acceptedClasses != null && acceptedClasses.size() != 0 && !acceptedClasses.contains(eclass))
return false;
if(epackage == PPPackage.eINSTANCE)
return isAcceptedByPP(od);
if(epackage == PPTPPackage.eINSTANCE)
return isAcceptedByPPTP(od);
return false;
}
protected boolean isNameMatches(SearchPattern searchPattern, IEObjectDescription eObjectDescription) {
String qualifiedName = qualifiedNameConverter.toString(eObjectDescription.getQualifiedName());
if(qualifiedName == null)
return false;
if(searchPattern.matches(qualifiedName))
return true;
int index = qualifiedName.lastIndexOf("::");
if(index != -1 && searchPattern.matches(qualifiedName.substring(index + 1)))
return true;
return false;
}
public void setResourceDescriptions(IResourceDescriptions resourceDescriptions) {
this.resourceDescriptions = resourceDescriptions;
}
}
Iterable<IEObjectDescription> findMatches(String searchPattern, Collection<EClass> acceptedClasses);
}