blob: 0f51a8561dc360cdd1c0ed24f053c07f5a39485e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Oracle 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:
* Oracle Corporation - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jst.jsf.common.metadata.query.internal.taglib;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.Model;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataDomainContext;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelContext;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelManager;
import org.eclipse.jst.jsf.common.metadata.internal.MetaDataModelContext;
import org.eclipse.jst.jsf.common.metadata.internal.MetaDataModelManagerFactory;
import org.eclipse.jst.jsf.common.metadata.query.AbstractEntityQueryVisitor;
import org.eclipse.jst.jsf.common.metadata.query.IResultSet;
import org.eclipse.jst.jsf.common.metadata.query.internal.HierarchicalSearchControl;
import org.eclipse.jst.jsf.common.metadata.query.internal.IHierarchicalEntityVisitor;
import org.eclipse.jst.jsf.common.metadata.query.internal.SearchControl;
import org.eclipse.jst.jsf.common.metadata.query.internal.IPredicateMatcher.MATCH;
import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleResultSet;
/**
* @author gekessle
*
*/
public class TaglibDomainEntityQuerySpecVisitor extends AbstractEntityQueryVisitor implements IHierarchicalEntityVisitor {
private HierarchicalSearchControl _control;
private ITaglibDomainEntityPredicateMatcher _matcher;
private IMetaDataDomainContext _context;
private List<Entity> _entityResults;
private Model _initialEntity;
private boolean _stop;
/**
* Constructor with default SearchControl
* @param context
* @param matcher
*/
public TaglibDomainEntityQuerySpecVisitor(final IMetaDataDomainContext context, final ITaglibDomainEntityPredicateMatcher matcher) {
this(context, matcher, new HierarchicalSearchControl());
}
/**
* Constructor
* @param context
* @param matcher
* @param control
*/
public TaglibDomainEntityQuerySpecVisitor(final IMetaDataDomainContext context, final ITaglibDomainEntityPredicateMatcher matcher, final HierarchicalSearchControl control) {
_matcher = matcher;
_context = context;
_control = control;
}
/**
* @return Set of {@link Entity}s matching the entity query spec
* Note: does not support wild card match of models yet.
*/
public IResultSet<Entity> findEntities() {// throws InvalidQuerySpecification, MetaDataException {
_matcher.reset();
//first find model according to matcher...
//DOES NOT SUPPORT WILD CARDS FOR MODEL URI YET!!!
//we cannot support wild cards because models are loaded lazily; even their id's.
final IMetaDataModelManager mgr = MetaDataModelManagerFactory.getMetaDataModelManagerInstance(getProject());
if (mgr != null) {
final Model model= mgr.getModel(getModelContext());
findEntities(model);
} else {
//throw err?
}
return new SimpleResultSet<Entity>(getInternalEntityResults());
}
private void findEntities(final Model model) {
if (model != null){
_initialEntity = model;
_initialEntity.accept(this);
}
}
private List<Entity> getInternalEntityResults(){
if (_entityResults == null){
_entityResults = new ArrayList<Entity>();
}
return _entityResults;
}
private IMetaDataModelContext getModelContext() {
return new MetaDataModelContext(getProject(), _context.getDomainId(), _matcher.getUri());
}
private IProject getProject() {
return (IProject)_context.getAdapter(IProject.class);
}
public boolean visitEnter(final Entity entity) {
_matcher.pushLevel();
if (_matcher.getCurrentLevel() <= _matcher.getMaxLevel()) {
final MATCH match = _matcher.matches(entity);
if (match == MATCH.FULLY) {
getInternalEntityResults().add(entity);
checkShouldStopVisitingEntities();
return false;
}
else if (match == MATCH.PARTIALLY) {
return true;
}
}
return false;
}
public boolean stopVisiting() {
return _stop;
}
private void checkShouldStopVisitingEntities(){
//implement how to set stop to signal to the entity accept() to skip visiting
if (_stop == false
&& _control.getCountLimit()== getInternalEntityResults().size()
&& _control.getCountLimit() != SearchControl.COUNT_LIMIT_NONE )
_stop = true;
}
public boolean visitLeave(Entity entity) {
// _stop = _matcher.checkShouldStopVisitingEntities();
// if (entity != _initialEntity)
// _entityQuery.popLevel();
if (entity != _initialEntity)
_matcher.popLevel();
return true;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor#visit(org.eclipse.jst.jsf.common.metadata.Entity)
*/
public void visit(final Entity key) {
//do nothing... all work now done in visitEnter/visitLeave
}
}