| package org.eclipse.jst.jsf.core.metadata.internal; |
| |
| import java.util.Iterator; |
| |
| import org.eclipse.jst.jsf.common.metadata.Entity; |
| import org.eclipse.jst.jsf.common.metadata.MetadataFactory; |
| import org.eclipse.jst.jsf.common.metadata.MetadataPackage; |
| import org.eclipse.jst.jsf.common.metadata.Model; |
| import org.eclipse.jst.jsf.common.metadata.Trait; |
| import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant; |
| import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider; |
| import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator; |
| import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.BooleanValue; |
| import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.StringValue; |
| import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesFactory; |
| import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute; |
| import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement; |
| import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace; |
| |
| /** |
| * Translates some pieces of a {@link Namespace} metadata into standard {@link Entity} and {@link Trait} metadata |
| * |
| */ |
| public class NamespaceMetaDataTranslator |
| implements IMetaDataTranslator { |
| /** |
| * {@link IMetaDataModelMergeAssistant} to use |
| */ |
| private IMetaDataModelMergeAssistant _assistant; |
| |
| public void translate(final IMetaDataModelMergeAssistant assistant) { |
| _assistant = assistant; |
| final Namespace ns = ((INamespaceModelProvider)_assistant.getSourceModelProvider()).getNamespace(); |
| doTranslate(ns); |
| } |
| |
| public boolean canTranslate(final IMetaDataSourceModelProvider modelProvider) { |
| if (modelProvider != null && |
| modelProvider instanceof INamespaceModelProvider) |
| return true; |
| return false; |
| } |
| |
| /** |
| * Set the assistant to use during the translation. Must be called prior to doTransalate(doc); |
| * @param assistant |
| */ |
| protected void setAssistant(final IMetaDataModelMergeAssistant assistant){ |
| _assistant = assistant; |
| } |
| |
| /** |
| * Transforms the Namespace into entities and traits of a standard metadata model |
| * using the assistant that must be set before this call. |
| * @param tagLib |
| */ |
| protected void doTranslate(final Namespace tagLib){ |
| createTags(tagLib); |
| createTagfileTraits(tagLib); |
| } |
| |
| /** |
| * @param entity |
| * @param key |
| * @param value |
| */ |
| protected void createSimpleStringEntityTraitIfNecessary(final Entity entity, final String key, |
| final String value) { |
| Trait t = findTraitOnEntityById(entity, key); |
| if (t == null){ |
| t = internalCreateTrait(entity, key); |
| |
| StringValue val = TraitTypesFactory.eINSTANCE.createStringValue(); |
| val.setValue(value); |
| |
| t.setValue(val); |
| } |
| } |
| |
| /** |
| * @param entity |
| * @param key |
| * @param value |
| */ |
| protected void createSimpleBooleanObjectEntityTraitIfNecessary(final Entity entity, |
| String key, boolean value) { |
| |
| Trait t = findTraitOnEntityById(entity, key); |
| if (t == null){ |
| t = internalCreateTrait(entity, key); |
| |
| BooleanValue val = TraitTypesFactory.eINSTANCE.createBooleanValue(); |
| val.setTrue(value); |
| |
| t.setValue(val); |
| } |
| |
| } |
| |
| /** |
| * @param entity |
| * @param key |
| * @return Trait |
| */ |
| protected Trait internalCreateTrait(final Entity entity, final String key) { |
| Trait t = MetadataFactory.eINSTANCE.createTrait(); |
| t.setId(key); |
| t.setSourceModelProvider(_assistant.getSourceModelProvider()); |
| entity.getTraits().add(t); |
| return t; |
| } |
| |
| /** |
| * @param entity |
| * @param key |
| * @return Trait |
| */ |
| protected Trait findTraitOnEntityById(final Entity entity, final String key) { |
| for (Iterator it=entity.getTraits().iterator();it.hasNext();){ |
| Trait t = (Trait)it.next(); |
| if (key.equals(t.getId())) |
| return t; |
| } |
| return null; |
| } |
| |
| /** |
| * @param nodeName |
| * @return Entity |
| */ |
| protected Entity findTagEntity(final String nodeName) { |
| for (Iterator it=getMergedModel().getChildEntities().iterator();it.hasNext();){ |
| Entity entity = (Entity)it.next(); |
| if (nodeName.equals(entity.getId())) |
| return entity; |
| } |
| return null; |
| } |
| |
| /** |
| * @param tag |
| * @param attributeName |
| * @return Attribute entity for supplied attribute name and given Tag entity. Will return null if not found. |
| */ |
| protected Entity findAttributeEntityForTagEntity(final Entity tag, final String attributeName) { |
| for (Iterator it=tag.getChildEntities().iterator();it.hasNext();){ |
| Entity attr = (Entity)it.next(); |
| if (attributeName.equals(attr.getId())) |
| return attr; |
| } |
| return null; |
| } |
| /** |
| * Create entities for tags |
| * @param tagLib |
| */ |
| protected void createTags(final Namespace tagLib) { |
| for (final ITagElement tag : tagLib.getViewElements()){ |
| Entity entity = findTagEntity(tag.getName()); |
| if (entity == null){ |
| entity = MetadataFactory.eINSTANCE.createEntity(); |
| entity.setId(getTagNodeName(tag)); |
| entity.setType("tag"); //$NON-NLS-1$ |
| getMergedModel().getChildEntities().add(entity); |
| } |
| setTagEntityTraits(tag, entity); |
| } |
| |
| } |
| |
| /** |
| * @param tag |
| * @return tag node name |
| */ |
| protected String getTagNodeName(final ITagElement tag) { |
| return tag.getName(); |
| } |
| |
| /** |
| * Sets the standard traits for a tag entity from the element declaration |
| * @param tag |
| * @param entity |
| */ |
| protected void setTagEntityTraits(final ITagElement tag, final Entity entity) { |
| createSimpleStringEntityTraitIfNecessary(entity, "display-label", getTagDisplayName(tag)); //$NON-NLS-1$ |
| createSimpleStringEntityTraitIfNecessary(entity, "description", getTagDescription(tag)); //$NON-NLS-1$ |
| createSimpleStringEntityTraitIfNecessary(entity, "small-icon", getTagSmallIcon(tag)); //$NON-NLS-1$ |
| createSimpleStringEntityTraitIfNecessary(entity, "large-icon", getTagLargeIcon(tag)); //$NON-NLS-1$ |
| createSimpleBooleanObjectEntityTraitIfNecessary(entity, "expert", getTagIsExpert(tag)); //$NON-NLS-1$ |
| createSimpleBooleanObjectEntityTraitIfNecessary(entity, "hidden", getTagIsHidden(tag)); //$NON-NLS-1$ |
| |
| createAttributeEntities(entity, tag); |
| } |
| |
| /** |
| * @param tagEntity |
| * @param tag |
| */ |
| protected void createAttributeEntities(final Entity tagEntity, final |
| ITagElement tag) { |
| |
| for (final ITagAttribute tagAttr : tag.getAttributes().values()){ |
| Entity attr = findAttributeEntityForTagEntity(tagEntity, tagAttr.getName()); |
| if (attr == null) { |
| attr = MetadataFactory.eINSTANCE.createEntity(); |
| attr.setId(tagAttr.getName()); |
| tagEntity.getChildEntities().add(attr); |
| } |
| createAttributeTraits(attr, tagAttr); |
| } |
| |
| |
| } |
| |
| /** |
| * @param attr |
| * @param tagAttr |
| */ |
| protected void createAttributeTraits(final Entity attr, |
| final ITagAttribute tagAttr) { |
| |
| createSimpleStringEntityTraitIfNecessary(attr, "description", getTagAttributeDescription(tagAttr)); //$NON-NLS-1$ |
| createSimpleBooleanObjectEntityTraitIfNecessary(attr, "required", getTagAttributeIsRequired(tagAttr)); //$NON-NLS-1$ |
| createSimpleStringEntityTraitIfNecessary(attr, "default-value", getTagAttributeDefaultValue(tagAttr)); //$NON-NLS-1$ |
| } |
| |
| /** |
| * @param tagAttr |
| * @return null. subclass should override if ITagAttribute has the metadata. |
| */ |
| protected String getTagAttributeDescription(final ITagAttribute tagAttr) {return tagAttr.getDescription();} |
| |
| /** |
| * @param tagAttr |
| * @return false. subclass should override if ITagAttribute has the metadata. |
| */ |
| protected boolean getTagAttributeIsRequired(final ITagAttribute tagAttr) {return tagAttr.isRequired();} |
| |
| /** |
| * @param tagAttr |
| * @return null. subclass should override if ITagAttribute has the metadata. |
| */ |
| protected String getTagAttributeDefaultValue(final ITagAttribute tagAttr) {return null;} |
| |
| /** |
| * @param tag |
| * @return false. subclass should override if ITagElement has the metadata. |
| */ |
| protected boolean getTagIsHidden(final ITagElement tag) {return false;} |
| |
| /** |
| * @param tag |
| * @return false. subclass should override if ITagElement has the metadata. |
| */ |
| protected boolean getTagIsExpert(final ITagElement tag) {return false;} |
| |
| /** |
| * @param tag |
| * @return null. subclass should override if ITagElement has the metadata. |
| */ |
| protected String getTagLargeIcon(final ITagElement tag) {return null;} |
| |
| /** |
| * @param tag |
| * @return null. subclass should override if ITagElement has the metadata. |
| */ |
| protected String getTagSmallIcon(ITagElement tag) {return null;} |
| |
| /** |
| * @param tag |
| * @return null. subclass should override if ITagElement has the metadata. |
| */ |
| protected String getTagDescription(final ITagElement tag) {return null;} |
| |
| /** |
| * @param tag |
| * @return tag.getElementName() |
| */ |
| protected String getTagDisplayName(ITagElement tag) {return tag.getName();} |
| |
| /** |
| * Creates standard traits for tag file entity from CMDocument metadata |
| * @param ns |
| */ |
| protected void createTagfileTraits(final Namespace ns) { |
| Model model = getMergedModel(); |
| |
| createSimpleStringEntityTraitIfNecessary(model, "display-label", getNamespaceDisplayLabel()); //$NON-NLS-1$ |
| createSimpleStringEntityTraitIfNecessary(model, "description", getNamespaceDescription()); //$NON-NLS-1$ |
| createSimpleStringEntityTraitIfNecessary(model, "default-prefix", getNamespaceDefaultPrefix()); //$NON-NLS-1$ |
| createSimpleBooleanObjectEntityTraitIfNecessary(model, "expert", getNamespaceExpert()); //$NON-NLS-1$ |
| createSimpleBooleanObjectEntityTraitIfNecessary(model, "hidden", getNamespaceHidden()); //$NON-NLS-1$ |
| |
| } |
| |
| /** |
| * @return the display label to use for this model. Subclasses should override if model has the meta data. |
| */ |
| protected String getNamespaceDisplayLabel(){ |
| return getMergedModel().getId(); |
| } |
| |
| /** |
| * @return default prefix to use for tags. Returns null. Subclasses should override if model has the meta data. |
| */ |
| protected String getNamespaceDefaultPrefix(){ |
| return null; |
| } |
| |
| /** |
| * @return description to use. Default is the URI. Subclasses should override if model has the meta data. |
| */ |
| protected String getNamespaceDescription(){ |
| return getMergedModel().getId(); |
| } |
| |
| /** |
| * @return false. Subclasses should override if model has the meta data. |
| */ |
| protected boolean getNamespaceExpert() { return false;} |
| |
| /** |
| * @return false. Subclasses should override if model has the meta data. |
| */ |
| protected boolean getNamespaceHidden() { |
| // Model model = (Model)_assistant.getMergedModel().getRoot(); |
| // if (model != null) { |
| // return model.getChildEntities().size() == 0 ? true : false; |
| // } |
| return false; |
| } |
| |
| /** |
| * @return a model of all entities and traits |
| */ |
| protected Model getMergedModel() { |
| Model model = (Model)_assistant.getMergedModel().getRoot(); |
| if (model == null){ |
| //need to create model key object |
| Model tld = createTLDModel(); |
| _assistant.getMergedModel().setRoot(tld); |
| model = (Model)_assistant.getMergedModel().getRoot(); |
| } |
| return model; |
| } |
| |
| /** |
| * @return new model |
| */ |
| protected Model createTLDModel() { |
| final Model entity = getFactory().createModel(); |
| entity.setId(_assistant.getMergedModel().getModelContext().getModelIdentifier()); |
| return entity; |
| } |
| |
| private MetadataFactory getFactory(){ |
| return (MetadataFactory) MetadataPackage.eINSTANCE.getEFactoryInstance(); |
| } |
| |
| } |