blob: 8ec6970925ad39a9fee06ce6261e7cc6d5e3e6e3 [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.internal.provisional;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jst.jsf.common.metadata.internal.DomainLoadingStrategyRegistry;
import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
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.internal.provisional.Entity;
import org.eclipse.jst.jsf.common.metadata.internal.provisional.Trait;
import org.eclipse.jst.jsf.common.metadata.internal.provisional.query.IMetaDataModelContext;
import org.eclipse.jst.jsf.common.metadata.internal.provisional.query.MetaDataQueryHelper;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IDOMContextResolver;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IStructuredDocumentContextResolverFactory;
import org.eclipse.jst.jsf.context.structureddocument.internal.provisional.IStructuredDocumentContext;
import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* Simple abstract class that implementers of {@link IMetaDataEnabledFeature} can subclass in the <b>TagLibDomain</b>
*
* @author Gerry Kessler - Oracle
*
*/
public abstract class AbstractMetaDataEnabledFeature implements IMetaDataEnabledFeature{
private MetaDataContext mdContext;
private IStructuredDocumentContext sdContext;
private IProject _project;
private static final List EMPTY_LIST = new ArrayList(0);
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.metadataprocessors.internal.provisional.IMetaDataEnabledFeature#setMetaDataContext(org.eclipse.jst.jsf.metadataprocessors.internal.provisional.MetaDataContext)
*/
public void setMetaDataContext(final MetaDataContext context) {
this.mdContext = context;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.metadataprocessors.internal.provisional.IMetaDataEnabledFeature#getMetaDataContext()
*/
public MetaDataContext getMetaDataContext() {
return mdContext;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.metadataprocessors.internal.provisional.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.internal.provisional.IMetaDataEnabledFeature#getStructuredDocumentContext()
*/
public IStructuredDocumentContext getStructuredDocumentContext() {
return sdContext;
}
private IProject getProject(){
if (_project == null){
_project = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(sdContext).getProject();
}
return _project;
}
//common metadata accessors
/**
* Return the single expected String value for a given property.
*
* Since the MetaDataContext, where the type-id was found,
* may have come from a wild card, or the property being looked up now is,
* we should first look for the named property on the specific element and
* only if not found, look for it on the * element.
*
* @param traitName property name
* @return String value
*/
protected String getTraitValueAsString(final String traitName){
//look for trait on given entity
final TaglibMetadataContext context = (TaglibMetadataContext)getMetaDataContext();
final IMetaDataModelContext modelContext = MetaDataQueryHelper.createMetaDataModelContext(getProject(), DomainLoadingStrategyRegistry.TAGLIB_DOMAIN, ((TaglibMetadataContext)getMetaDataContext()).getUri());
final String entityKey = context.getTagName() +"/"+ context.getAttributeName();
final Trait t = MetaDataQueryHelper.getTrait(modelContext, entityKey, traitName);
if (t != null){
return TraitValueHelper.getValueAsString(t);
}
// //if not present look on */attributeName
// entityKey = "*/"+ ((TaglibMetadataContext)getMetaDataContext()).getAttributeName();
// t = MetaDataQueryHelper.getTrait(modelContext, entityKey, traitName);
//
// if (t!= null){
// return TraitValueHelper.getValueAsString(t);
// }
//
// //now look for the '*' entity
// entityKey = "*";
// t = MetaDataQueryHelper.getTrait(modelContext, entityKey, traitName);
//
// if (t!= null){
// return TraitValueHelper.getValueAsString(t);
// }
return null;
}
/**
* Return the List of values for a given property.
*
* Since the MetaDataContext, where the type-id was found,
* may have come from a wild card, or the property being looked up now is,
* we should first look for the named property on the specific element and
* only if not found, look for it on the * element.
*
* @param traitName trait name
* @return List of String values
*/
protected List getTraitValueAsListOfStrings(final String traitName){
//look for trait on given entity
final TaglibMetadataContext context = (TaglibMetadataContext)getMetaDataContext();
final IMetaDataModelContext modelContext = MetaDataQueryHelper.createMetaDataModelContext(getProject(), DomainLoadingStrategyRegistry.TAGLIB_DOMAIN, ((TaglibMetadataContext)getMetaDataContext()).getUri());
final String entityKey = context.getTagName() +"/"+ context.getAttributeName();
final Entity entity = ((TaglibMetadataContext)getMetaDataContext()).getEntity();
final Trait t = MetaDataQueryHelper.getTrait(entity, traitName);
if (t != null){
return TraitValueHelper.getValueAsListOfStrings(t);
}
return EMPTY_LIST;
}
private String getDocContextElementName() {
final IDOMContextResolver dom = IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(getStructuredDocumentContext());
if (dom == null)
return null;
if (dom.getNode().getNodeType() == Node.ATTRIBUTE_NODE){
final Attr anode = (Attr)dom.getNode();
final Element elem = anode.getOwnerElement();
return elem.getLocalName();
}
return dom.getNode().getLocalName();
}
/**
* @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;
}
}