| /******************************************************************************* |
| * Copyright (c) 2001, 2008 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 |
| *******************************************************************************/ |
| package org.eclipse.jst.pagedesigner.itemcreation; |
| |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.jst.jsf.common.dom.TagIdentifier; |
| 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.TraitValueHelper; |
| import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext; |
| import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper; |
| import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants; |
| import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory; |
| import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo; |
| import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos; |
| import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo; |
| import org.eclipse.jst.pagedesigner.dom.IDOMPosition; |
| import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry; |
| import org.eclipse.jst.pagedesigner.utils.JSPUtil; |
| import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; |
| |
| /** |
| * Value object that wraps creation data |
| * |
| * <p><b>Provisional API - subject to change</b></p> |
| * |
| * @author cbateman |
| * |
| */ |
| public final class CreationData |
| { |
| private final TagToolPaletteEntry _tagEntry; |
| private final String _prefix; |
| private final IDOMPosition _domPosition; |
| private final IDOMModel _model; |
| private final IAdaptable _customizationData; |
| |
| private TagIdentifier _tagId; // = null; lazy init on creation |
| |
| /** |
| * The tag {@link Entity} being created |
| */ |
| private Entity _tagEntity; // = null; lazy load because derived from |
| // potentially expensive meta-data search |
| |
| /** |
| * The {@link ITaglibDomainMetaDataModelContext} for the tag creation |
| */ |
| private final ITaglibDomainMetaDataModelContext _taglibMetaDataContext; |
| |
| // mutable because it may be changed from the original _domPosition |
| private IDOMPosition _adjustedPosition; |
| |
| |
| /** |
| * @param tagEntry TODO: remove this direct dependence on the palette |
| * @param model |
| * @param domPosition |
| * @param taglibMetaDataContext |
| * @param customizationData |
| */ |
| public CreationData(final TagToolPaletteEntry tagEntry, final IDOMModel model, final IDOMPosition domPosition, final ITaglibDomainMetaDataModelContext taglibMetaDataContext, final IAdaptable customizationData) |
| { |
| super(); |
| this._tagEntry = tagEntry; |
| this._prefix = getPrefix(getUri(), model, getDefaultPrefix()); |
| this._taglibMetaDataContext = taglibMetaDataContext; |
| this._domPosition = domPosition; |
| this._adjustedPosition = _domPosition; |
| this._model = model; |
| this._customizationData = customizationData; |
| } |
| |
| /** |
| * Returns the ns prefix for the tag and also creates taglib reference if necessary |
| * @param uri |
| * @param model |
| * @param suggested |
| * @return prefix to use |
| */ |
| protected static String getPrefix(String uri, IDOMModel model, |
| String suggested) { |
| // TODO: this shouldn't really add to the document |
| if (ITLDConstants.URI_HTML.equalsIgnoreCase(uri) |
| || ITLDConstants.URI_JSP.equalsIgnoreCase(uri) |
| || CMDocType.JSP11_DOC_TYPE.equalsIgnoreCase(uri)) { |
| return null; |
| } |
| |
| // now handles custom tag lib |
| return JSPUtil.getOrCreatePrefix(model, uri, suggested); |
| } |
| |
| /** |
| * @return the tag identifier uri |
| */ |
| public String getUri() { |
| return _tagEntry.getURI(); |
| } |
| |
| /** |
| * @return the default prefix |
| */ |
| public String getDefaultPrefix() { |
| return _tagEntry.getDefaultPrefix(); |
| } |
| |
| /** |
| * @return the local prefix for the tag |
| */ |
| public String getPrefix() { |
| return _prefix; |
| } |
| |
| /** |
| * @return the tag name |
| */ |
| public String getTagName() { |
| return _tagEntry.getTagName(); |
| } |
| |
| /** |
| * @return the id |
| */ |
| private String getItemId() { |
| return _tagEntry.getId(); |
| } |
| |
| /** |
| * @return the palette entry that this creation info is based on |
| */ |
| public TagToolPaletteEntry getTagEntry() { |
| return _tagEntry; |
| } |
| |
| /** |
| * @return {@link TagCreationInfo} for the tag entity |
| */ |
| public TagCreationInfo getTagCreationInfo(){ |
| Model model = TaglibDomainMetaDataQueryHelper.getModel(_taglibMetaDataContext); |
| if (model != null){ |
| Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, PaletteInfos.TRAIT_ID); |
| if (trait != null){ |
| PaletteInfos pis = (PaletteInfos)trait.getValue(); |
| PaletteInfo pi = pis.findPaletteInfoById(getItemId()); |
| if (pi != null){ |
| return pi.getTagCreation(); |
| } |
| } |
| //tag-creation trait on entity directly? |
| Entity tag = getTagEntity(); |
| if (tag != null){//metadata exists |
| trait = TaglibDomainMetaDataQueryHelper.getTrait(tag, "tag-create"); |
| if (trait != null && trait.getValue() != null){ |
| return (TagCreationInfo)trait.getValue(); |
| } |
| } |
| } |
| return null; |
| } |
| |
| |
| /** |
| * @return the {@link Entity} for this tag element being created |
| */ |
| public Entity getTagEntity() { |
| if (_tagEntity == null){ |
| _tagEntity = TaglibDomainMetaDataQueryHelper.getEntity(_taglibMetaDataContext, getTagName()); |
| |
| } |
| return _tagEntity; |
| } |
| |
| /** |
| * @return flag indicating that html form container ancestor is required |
| */ |
| public boolean isHTMLFormRequired() { |
| Trait t = TaglibDomainMetaDataQueryHelper.getTrait(getTagEntity(), "requires-html-form"); |
| if (t != null) |
| return TraitValueHelper.getValueAsBoolean(t); |
| |
| return false; |
| } |
| |
| /** |
| * @return flag indicating that jsf component |
| */ |
| public boolean isJSFComponent() { |
| Model model = TaglibDomainMetaDataQueryHelper.getModel(_taglibMetaDataContext); |
| Trait t = TaglibDomainMetaDataQueryHelper.getTrait(model, "is-jsf-component-library"); |
| if (t != null) |
| return TraitValueHelper.getValueAsBoolean(t); |
| |
| return false; |
| } |
| |
| /** |
| * @return the metadata context for the tag |
| */ |
| public ITaglibDomainMetaDataModelContext getTaglibMetaDataContext() { |
| return _taglibMetaDataContext; |
| } |
| |
| /** |
| * @return the original dom position of the tag creation |
| */ |
| public IDOMPosition getDomPosition() { |
| return _domPosition; |
| } |
| |
| /** |
| * @return the dom model |
| */ |
| public IDOMModel getModel() |
| { |
| return _model; |
| } |
| |
| /** |
| * @return the adjusted position (calculated to account for containers etc.) |
| */ |
| public IDOMPosition getAdjustedPosition() { |
| return _adjustedPosition; |
| } |
| |
| /** |
| * @param adjustedPosition |
| */ |
| /*package*/ void setAdjustedPosition(IDOMPosition adjustedPosition) { |
| _adjustedPosition = adjustedPosition; |
| } |
| |
| /** |
| * @return the TagIdentifer for the tag to be created |
| */ |
| public TagIdentifier getTagId() |
| { |
| if (_tagId == null) |
| { |
| _tagId = TagIdentifierFactory.createJSPTagWrapper(getUri(), getTagName()); |
| } |
| return _tagId; |
| } |
| |
| /** |
| * @return the customization data passed in from the tool. May be null. |
| */ |
| public IAdaptable getDropCustomizationData() { |
| return _customizationData; |
| } |
| } |