blob: 16e579f82d71588ecbeb5d5d28b730264c05c6f6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 Oracle Corporation.
* 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 - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.common.metadata.query;
import javax.xml.namespace.QName;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jst.jsf.common.JSFCommonPlugin;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.Model;
import org.eclipse.jst.jsf.common.metadata.Trait;
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.MetaDataModelManagerFactory;
import org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor;
import org.eclipse.jst.jsf.common.metadata.internal.TaglibDomainMetaDataModelContextImpl;
import org.eclipse.jst.jsf.common.metadata.query.internal.HierarchicalSearchControl;
import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleEntityQueryVisitorImpl;
import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleTraitQueryVisitorImpl;
/**
* Helper class with static methods to simplify querying of a metadata model.
*
* <p>Steps for use:
* <br>1) Get the ITaglibDomainMetaDataModelContext using createMetaDataModelContext or createTagLibraryDomainMetaDataModelContext
* <br>2) Use appropriate getXXX methods using the ITaglibDomainMetaDataModelContext.
* <p><b>Provisional API - subject to change</b></p>
*
* @deprecated - Helios <p>
* use ITaglibMetaDataQuery:<p>
* <code>
* IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(project);<br/>
* ITaglibMetaDataQuery query = MetaDataQueryFactory.getInstance().createQuery(context);
* </code>
* <p>
* @see IResultSet
* @see IEntityQueryVisitor
* @see ITraitQueryVisitor
* @see ITaglibDomainMetaDataModelContext
* @see Model
* @see Entity
* @see Trait
*
*/
public final class TaglibDomainMetaDataQueryHelper{
/**
* Domain id for Tag library domain of metatdata
*/
public static final String TAGLIB_DOMAIN = "TagLibraryDomain"; //need better place for this //$NON-NLS-1$
/**
* private constructor
*/
private TaglibDomainMetaDataQueryHelper (){
super();
}
/**
* Convenience method for creating {@link ITaglibDomainMetaDataModelContext}s for TAGLIB_DOMAIN
* @param project
* @param uri
* @return ITaglibDomainMetaDataModelContext
*/
public static ITaglibDomainMetaDataModelContext createMetaDataModelContext(IProject project, String uri){
return new TaglibDomainMetaDataModelContextImpl(TAGLIB_DOMAIN, project, uri);
}
/**
* @param modelContext
* @return Model object for given context. May return null if not located.
*/
public static Model getModel(final ITaglibDomainMetaDataModelContext modelContext) {
// MetaDataModel model = getMDModel(modelContext);
// //we may want to throw error that model is empty
// if (model != null && !model.isEmpty()){
// return (Model)model.getRoot();
// }
return getMDModel(modelContext);
}
/**
* @param modelContext
* @param entityKey relative to root of the model
* @return the first entity match from the root of the model. May return null.
*/
public static Entity getEntity(final ITaglibDomainMetaDataModelContext modelContext,
final String entityKey) {
IEntityQueryVisitor visitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1, HierarchicalSearchControl.SCOPE_ALL_LEVELS));
IResultSet/*<Entity>*/ rs = getEntities(modelContext,entityKey, visitor);
Entity e = null;
try {
if (! rs.getResults().isEmpty()){
e = (Entity)rs.getResults().get(0);
}
rs.close();
} catch (MetaDataException ex) {
JSFCommonPlugin.log(IStatus.ERROR, "Error in Helper.getEntity() - 1", ex); //$NON-NLS-1$
}
return e;
}
/**
* @param modelContext
* @param entityKey relative to root of model
* @param visitor
* @return an IResultSet of entity objects
*/
public static IResultSet/*<Entity>*/ getEntities(final ITaglibDomainMetaDataModelContext modelContext,
final String entityKey, final IEntityQueryVisitor visitor){
Model model = getModel(modelContext);
//we may want to throw error that model is empty
return getEntities(model, entityKey, visitor);
}
/**
* @param entity
* @param traitKey
* @return a trait or null for the given entity and traitKey using a SimpleEntityQueryVisitorImpl
*/
public static Trait getTrait(final Entity entity, final String traitKey){
ITraitQueryVisitor visitor = new SimpleTraitQueryVisitorImpl();
Trait t= null;
IResultSet/*<Trait>*/ rs = getTraits(entity, traitKey, visitor);
try {
if (! rs.getResults().isEmpty()){
t = (Trait)rs.getResults().get(0);
}
rs.close();
} catch (MetaDataException ex) {
JSFCommonPlugin.log(IStatus.ERROR, "Error in Helper.getTrait()", ex); //$NON-NLS-1$
}
return t;
}
/**
* @param entity
* @param traitKey
* @param traitQueryVisitor
* @return an IResultSet of trait objects using supplied traitQueryVisitor. IResultSet should NOT be null.
*/
public static IResultSet/*<Trait>*/ getTraits(Entity entity, String traitKey,
ITraitQueryVisitor traitQueryVisitor) {
IResultSet/*<Trait>*/ rs = traitQueryVisitor.findTraits(entity, traitKey);
return rs;
}
/**
* @param initialEntityContext
* @param entityKey relative to initial passed entity
* @return the first entity located by key using SimpleEntityQueryVisitorImpl
*/
public static Entity getEntity(Entity initialEntityContext, String entityKey) {
IEntityQueryVisitor visitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1, HierarchicalSearchControl.SCOPE_ALL_LEVELS));
Entity e= null;
IResultSet/*<Entity>*/ rs = getEntities(initialEntityContext, entityKey, visitor);
try {
if (! rs.getResults().isEmpty()){
e = (Entity)rs.getResults().get(0);
}
rs.close();
} catch (MetaDataException ex) {
JSFCommonPlugin.log(IStatus.ERROR, "Error in Helper.getEntity() - 0", ex); //$NON-NLS-1$
}
return e;
}
/**
* @param initialEntityContext
* @param entityQuery relative to initial passed entity
* @param entityKeyQueryVisitor
* @return IResultSet of entities located by key using entityQueryVisitor. IResultSet should NOT be null.
*/
public static IResultSet/*<Entity>*/ getEntities(Entity initialEntityContext, String entityQuery,
IEntityQueryVisitor entityKeyQueryVisitor) {
return entityKeyQueryVisitor.findEntities(initialEntityContext, entityQuery);
}
/**
* Retrieve the MetaDataModel from the ModelManager for given key
* @param modelContext
* @return Model
*/
private static Model getMDModel(final ITaglibDomainMetaDataModelContext modelContext){
final IMetaDataModelContext context = getContextAdapter(modelContext);
final IMetaDataModelManager mgr = MetaDataModelManagerFactory.getMetaDataModelManagerInstance(modelContext.getProject());
if (mgr != null)
return mgr.getModel(context);
// MetaDataModelManager mgr = null;
// if (modelContext.getProject() != null)
// mgr = MetaDataModelManager.getInstance(modelContext.getProject());
// else //temp(?)
// mgr = MetaDataModelManager.getSharedInstance();
//
// if (mgr != null)
// return mgr.getModel(modelContext);
return null;
}
private static IMetaDataModelContext getContextAdapter(
final ITaglibDomainMetaDataModelContext modelContext) {
return new IMetaDataModelContext() {
public Object getAdapter(Class adapter) {
if (adapter == IProject.class)
return getProject();
else if (adapter == ModelKeyDescriptor.class)
return new ModelKeyDescriptor(modelContext.getProject(), modelContext.getDomainID(), modelContext.getURI());
return null;
}
public String getDomainId() {
return modelContext.getDomainID();
}
public IProject getProject() {
return modelContext.getProject();
}
public String getModelIdentifier() {
//doing below for "fixing" the jsp11 uri
return ((ModelKeyDescriptor)getAdapter(ModelKeyDescriptor.class)).getUri();
}
};
}
/**
* @param modelContext
* @param entityKey
* @param traitKey
* @return first trait found for entity and trait key starting from root of the model using SimpleMetaDataQueryImpl
*/
public static Trait getTrait(final ITaglibDomainMetaDataModelContext modelContext,
final String entityKey, final String traitKey) {
Entity entity = getEntity(modelContext, entityKey);
Trait t = null;
if (entity != null){
t = getTrait(entity, traitKey);
}
return t;
}
/**
* @param tagEntity
* @return QName for tag entity
*/
public static QName getQNameForTagEntity(Entity tagEntity) {
Assert.isTrue(tagEntity != null);
return new QName(tagEntity.getModel().getCurrentModelContext().getUri(), tagEntity.getId());
}
}