blob: f202b1fa2c61b468f04811cb815a5353f37e3c17 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 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:
* Cameron Bateman - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.facelet.core.internal.registry;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
import org.eclipse.jst.jsf.common.runtime.internal.model.types.TypeInfo;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IHandlerTagElement.TagHandlerType;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
import org.eclipse.jst.jsf.designtime.internal.Messages;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataLoader;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataMapper;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping;
import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.AbstractTagResolvingStrategy;
import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.DefaultTagTypeInfo;
import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.ComponentTag;
import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.ConverterTag;
import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.HandlerTag;
import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.NoArchetypeFaceletTag;
import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.ValidatorTag;
import org.osgi.framework.Version;
/**
* Resolves facelet tags from JSF framework metadata.
*
* @author cbateman
*
*/
public class FaceletMetaResolvingStrategy
extends
AbstractTagResolvingStrategy<IFaceletTagResolvingStrategy.TLDWrapper, String>
implements IFaceletTagResolvingStrategy
{
/**
* strategy id
*/
public final static String ID = "org.eclipse.jst.jsf.facelet.metadata.FaceletMetaResolvingStrategy"; //$NON-NLS-1$
/**
* displayable nameb
*/
public final static String DISPLAY_NAME = Messages.DefaultJSPTagResolver_DisplayName;
private final ViewMetadataLoader _loader;
private final ViewMetadataMapper _mapper;
private final FaceletDocumentFactory _factory;
/**
* @param project
* @param factory
*/
public FaceletMetaResolvingStrategy(final IProject project,
final FaceletDocumentFactory factory)
{
_factory = factory;
_loader = new ViewMetadataLoader(project);
_mapper = new ViewMetadataMapper();
}
@Override
public ITagElement resolve(
final IFaceletTagResolvingStrategy.TLDWrapper elementDecl)
{
final String uri = elementDecl.getUri();
final String tagName = elementDecl.getTagDefn().getTagName();
final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(
uri, tagName);
final TagMapping mapping = _loader.getTagToViewMapping(tagId);
TypeInfo elementType = null;
if (mapping != null)
{
elementType = findTypeInfo(mapping, "1.1", null); //$NON-NLS-1$
}
final List<FaceletTaglibTagAttribute> attributes =
elementDecl.getTagDefn().getAttribute();
if (elementType instanceof ComponentTypeInfo)
{
return new ComponentTag(uri, tagName,
(ComponentTypeInfo) elementType, null, _factory,
new MetadataAttributeAdvisor(tagId, _loader, attributes));
}
else if (elementType instanceof ConverterTypeInfo)
{
return new ConverterTag(uri, tagName,
(ConverterTypeInfo) elementType, null, _factory,
new MetadataAttributeAdvisor(tagId, _loader, attributes));
}
else if (elementType instanceof ValidatorTypeInfo)
{
return new ValidatorTag(uri, tagName,
(ValidatorTypeInfo) elementType, null, _factory,
new MetadataAttributeAdvisor(tagId, _loader, attributes));
}
else if (elementType instanceof TagHandlerType)
{
return new HandlerTag(uri, tagName,
(TagHandlerType) elementType, null, _factory,
new MetadataAttributeAdvisor(
tagId, _loader, attributes));
}
else if (DefaultTagTypeInfo.isDefaultLib(tagId.getUri()))
{
return new NoArchetypeFaceletTag(uri, tagName, _factory, new MetadataAttributeAdvisor(tagId, _loader, attributes));
}
// not found
return null;
}
private TypeInfo findTypeInfo(final TagMapping mapping,
final String jsfVersion, final String libVersion)
{
final EList list = mapping.getVersionedTagToViewMappings();
FIND_BY_VERSION: for (final Iterator<?> it = list.iterator(); it
.hasNext();)
{
Object obj = it.next();
if (obj instanceof TagToViewObjectMapping)
{
final TagToViewObjectMapping viewMapping = (TagToViewObjectMapping) obj;
final String minJsfVersionString = viewMapping
.getMinJSFVersion();
if (minJsfVersionString != null)
{
try
{
final Version version = new Version(jsfVersion);
final Version minVersion = Version
.parseVersion(minJsfVersionString);
if (version.compareTo(minVersion) < 0)
{
// my version is less than the minimum specified
// by this meta-data
continue FIND_BY_VERSION;
}
}
catch (final IllegalArgumentException iae)
{
continue FIND_BY_VERSION;
}
}
final String minLibVersionString = viewMapping
.getMinLibraryVersion();
if (libVersion != null && minLibVersionString != null)
{
try
{
final Version version = new Version(libVersion);
final Version minLibVersion = Version
.parseVersion(minLibVersionString);
if (version.compareTo(minLibVersion) < 0)
{
// my lib version is less than the minimum specified
// by the meta-data
continue FIND_BY_VERSION;
}
}
catch (IllegalArgumentException iae)
{
continue FIND_BY_VERSION;
}
}
return _mapper.mapToFrameworkData(viewMapping.getTypeInfo());
}
}
return null;
}
@Override
public String getId()
{
return ID;
}
public String getDisplayName()
{
return DISPLAY_NAME;
}
}