blob: d9b6cd8c7f301a043d59fe8957d20d421fd0aadd [file] [log] [blame]
/*******************************************************************************
* 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.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
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 ITagDropSourceData _creationProvider;
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 creationProvider
* @param model
* @param domPosition
* @param taglibMetaDataContext
* @param customizationData
*/
public CreationData(final ITagDropSourceData creationProvider,
final IDOMModel model, final IDOMPosition domPosition,
final ITaglibDomainMetaDataModelContext taglibMetaDataContext,
final IAdaptable customizationData)
{
super();
this._creationProvider = creationProvider;
this._taglibMetaDataContext = taglibMetaDataContext;
this._domPosition = domPosition;
this._adjustedPosition = _domPosition;
this._model = model;
this._customizationData = customizationData;
this._prefix = getPrefix(getUri(), model, getDefaultPrefix());
}
/**
* 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 (uri==null || 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() {
ITagDropOverrider overrider = getTagDropOverrider();
if (overrider != null && overrider.getUriOverride() != null)
return overrider.getUriOverride();
return _creationProvider.getNamespace();
}
/**
* @return the default prefix
*/
public String getDefaultPrefix() {
ITagDropOverrider overrider = getTagDropOverrider();
if (overrider != null && overrider.getDefaultPrefixOverride() != null)
return overrider.getDefaultPrefixOverride();
return _creationProvider.getDefaultPrefix();
}
private ITagDropOverrider getTagDropOverrider() {
if (getDropCustomizationData() != null
&& getDropCustomizationData()
.getAdapter(ITagDropOverrider.class) != null) {
return (ITagDropOverrider)getDropCustomizationData()
.getAdapter(ITagDropOverrider.class);
}
return null;
}
/**
* @return the local prefix for the tag
*/
public String getPrefix() {
return _prefix;
}
/**
* @return the tag name
*/
public String getTagName() {
ITagDropOverrider overrider = getTagDropOverrider();
if (overrider != null && overrider.getTagNameOverride() != null)
return overrider.getTagNameOverride();
return _creationProvider.getTagName();
}
/**
* @return the creation provider
*/
public ITagDropSourceData getTagCreationProvider()
{
return _creationProvider;
}
/**
* @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"); //$NON-NLS-1$
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"); //$NON-NLS-1$
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;
}
}