blob: 7485d66065b7ea7485a511e2cccc6e07393e4470 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 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:
* Gerry Kessler/Oracle - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.metadataprocessors;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.Trait;
import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataDomainContext;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
import org.eclipse.jst.jsf.common.metadata.query.internal.IMetaDataQuery;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryContextFactory;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryFactory;
import org.eclipse.jst.jsf.context.IModelContext;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
import org.eclipse.jst.jsf.metadataprocessors.internal.IMetaDataEnabledFeature2;
/**
* Simple abstract class that implementers of {@link IMetaDataEnabledFeature} can subclass in the <b>TagLibDomain</b> of metadata
* <p><b>Provisional API - subject to change</b></p>*
*/
public abstract class AbstractMetaDataEnabledFeature implements IMetaDataEnabledFeature, IMetaDataEnabledFeature2{
private MetaDataContext mdContext;
private IModelContext sdContext;
private IProject _project;
private IFile _file;
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#setMetaDataContext(org.eclipse.jst.jsf.metadataprocessors.MetaDataContext)
*/
public void setMetaDataContext(final MetaDataContext context) {
this.mdContext = context;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#getMetaDataContext()
*/
public MetaDataContext getMetaDataContext() {
return mdContext;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#setStructuredDocumentContext(org.eclipse.wtp.jsf.context.structureddocument.IStructuredDocumentContext)
*/
public void setStructuredDocumentContext(final IStructuredDocumentContext context) {
this.sdContext = context;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#getStructuredDocumentContext()
*/
public IStructuredDocumentContext getStructuredDocumentContext() {
if (sdContext instanceof IStructuredDocumentContext)
{
return (IStructuredDocumentContext) sdContext;
}
return null;
}
/**
* @return the model context
*/
public IModelContext getModelContext() {
return this.sdContext;
}
/**
* @param modelContext
*/
public void setModelContext(IModelContext modelContext)
{
this.sdContext = modelContext;
}
/**
* @return the project
*/
protected IProject getProject2()
{
if (_project == null)
{
_project = IStructuredDocumentContextResolverFactory2.INSTANCE.getWorkspaceContextResolver2(sdContext)
.getProject();
}
return _project;
}
/**
* @return the file
*/
protected IFile getFile2()
{
if (_file == null)
{
IResource res = IStructuredDocumentContextResolverFactory2.INSTANCE.getWorkspaceContextResolver2(sdContext)
.getResource();
if (res instanceof IFile) _file = (IFile) res;
}
return _file;
}
//common metadata accessors
/**
* Return the single expected String value for a given property.
*
* @param traitName property name
* @return String value
*/
protected String getTraitValueAsString(final String traitName){
Trait t = getTraitForEntityUsingContext(traitName);
if (t != null){
return TraitValueHelper.getValueAsString(t);
}
return null;
}
/**
* Return the List of values for a given property.
*
* @param traitName trait name
* @return List of String values
*/
protected List getTraitValueAsListOfStrings(final String traitName){
Trait t = getTraitForEntityUsingContext(traitName);
if (t != null){
return TraitValueHelper.getValueAsListOfStrings(t);
}
return Collections.EMPTY_LIST;
}
/**
* Return a boolean value for the given named trait .
*
* @param traitName property name
* @return boolean value. Returns false if trait was not located.
*/
protected boolean getTraitValueAsBoolean(final String traitName){
Trait t = getTraitForEntityUsingContext(traitName);
if (t != null){
return TraitValueHelper.getValueAsBoolean(t);
}
return false;
}
private Trait getTraitForEntityUsingContext(final String traitName) {
//look for trait on given entity
final Entity entity = getMetaDataContext().getEntity();
final IMetaDataDomainContext modelContext = getMetaDataDomainContext();
final IMetaDataQuery query = MetaDataQueryFactory.getInstance().createQuery(modelContext);
return query.getQueryHelper().getTrait(entity, traitName);
}
private IMetaDataDomainContext getMetaDataDomainContext() {
final IFile file = getFile2();
if (file != null)
{
return MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(file);
}
IProject project = getProject2();
if (project != null)
{
return MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(project);
}
return null;
}
/**
* @return small-icon name
*/
protected String getSmallIcon() {
return getTraitValueAsString(IPossibleValues.POSSIBLE_VALUES_SMALL_ICON_PROP_NAME);
}
/**
* @return ImageDescriptor from the small-icon property for annotation from the same
* source model provider as the trait
*/
protected ImageDescriptor getImage() {
final String smallIcon = getSmallIcon();
if (smallIcon == null)
return null;
try {
Trait t = getMetaDataContext().getTrait();
IMetaDataSourceModelProvider provider = t.getSourceModelProvider();
IImageDescriptorProvider ip = (IImageDescriptorProvider)provider.getAdapter(IImageDescriptorProvider.class);
if (ip != null){
return ip.getImageDescriptor(smallIcon);
}
} catch (RuntimeException e) {
//TODO: log error?
}
return null;
}
}