/*******************************************************************************
* Copyright (c) 2009 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.internal.core.refactoring;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IJavaElement;
import org.jboss.tools.common.el.core.model.ELExpression;
import org.jboss.tools.common.el.core.model.ELInvocationExpression;
import org.jboss.tools.common.el.core.resolver.ELResolution;
import org.jboss.tools.common.el.core.resolver.ELResolver;
import org.jboss.tools.common.el.core.resolver.ELResolverFactoryManager;
import org.jboss.tools.common.el.core.resolver.ELSegment;
import org.jboss.tools.common.el.core.resolver.ElVarSearcher;
import org.jboss.tools.common.el.core.resolver.SimpleELContext;
import org.jboss.tools.common.el.core.resolver.Var;
import org.jboss.tools.jst.web.kb.refactoring.RefactorSearcher;
import org.jboss.tools.seam.core.ISeamComponent;
import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration;
import org.jboss.tools.seam.core.SeamCorePlugin;
import org.jboss.tools.seam.core.SeamProjectsSet;
public abstract class SeamRefactorSearcher extends RefactorSearcher {
private SeamProjectsSet projectsSet;
protected ISeamComponent seamComponent;
public SeamRefactorSearcher(IFile file, String name){
super(file, name);
projectsSet = new SeamProjectsSet(file.getProject());
}
public SeamRefactorSearcher(IFile file, String name, IJavaElement element){
this(file, name);
javaElement = element;
}
public SeamRefactorSearcher(IFile file, String name, ISeamComponent component){
this(file, name);
this.seamComponent = component;
}
protected IProject[] getProjects(){
return projectsSet.getAllProjects();
}
protected IContainer getViewFolder(IProject project){
if(project.equals(projectsSet.getWarProject()))
return projectsSet.getDefaultViewsFolder();
else if(project.equals(projectsSet.getEarProject()))
return projectsSet.getDefaultEarViewsFolder();
return null;
}
@Override
protected void outOfSynch(IResource resource){
// do nothing
}
protected boolean checkMatch(IFile file, boolean isOutOfSync, ELExpression operand, int offset, int length){
if(javaElement != null && operand != null) {
return resolve(file, isOutOfSync, operand, offset-getOffset((ELInvocationExpression)operand));
} else if(seamComponent != null && operand != null) {
return resolveComponentsReferences(file, isOutOfSync, operand, offset-getOffset((ELInvocationExpression)operand));
} else if(isOutOfSync) {
return false;
} else {
match(file, offset, length);
return true;
}
}
protected void updateEnvironment(IProject project){
if(seamComponent == null)
return;
ISeamProject seamProject = SeamCorePlugin.getSeamProject(project, true);
if(seamProject == null)
return;
ISeamComponent oldComponent = seamComponent;
if(oldComponent.getJavaDeclaration() != null){
seamComponent = getComponent(seamProject, oldComponent.getName(), (IFile)oldComponent.getJavaDeclaration().getResource());
}else{
for(ISeamXmlComponentDeclaration xDecl : oldComponent.getXmlDeclarations()){
seamComponent = getComponent(seamProject, oldComponent.getName(), (IFile)xDecl.getResource());
if(seamComponent != null)
return;
}
}
if(seamComponent == null)
seamComponent = oldComponent;
}
private ISeamComponent getComponent(ISeamProject seamProject, String name, IFile file){
Set<ISeamComponent> components = seamProject.getComponentsByPath(file.getFullPath());
for(ISeamComponent component : components){
if(component.getName().equals(name))
return component;
}
return null;
}
private boolean resolveComponentsReferences(IFile file, boolean fileIsNotAccessible, ELExpression operand, int offset) {
ELResolver[] resolvers = ELResolverFactoryManager.getInstance()
.getResolvers(file);
for (ELResolver resolver : resolvers) {
SimpleELContext context = new SimpleELContext();
context.setResource(file);
context.setElResolvers(resolvers);
List<Var> vars = ElVarSearcher.findAllVars(context, offset,
resolver);
context.setVars(vars);
ELResolution resolution = resolver.resolve(context, operand, offset);
if(resolution!=null) {
List<ELSegment> segments = resolution.findSegmentsByVariable(seamComponent);
if(!segments.isEmpty() && fileIsNotAccessible) {
return false;
}
for(ELSegment segment : segments){
match(file, offset+segment.getSourceReference().getStartPosition(), segment.getSourceReference().getLength());
}
}
}
return true;
}
}