blob: 975775f505edaa86890ef170056b5bab5853a818 [file] [log] [blame]
package org.eclipse.jst.jsf.designtime.internal.view.mapping;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.xmi.XMLHelper;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
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.runtime.internal.model.types.ClassTypeInfo;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingFactory;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping;
/**
* Generates View metadata from common.runtime objects.
*
* @author cbateman
*
*/
public class ViewMetadataGenerator
{
private final ResourceSet _resourceSet;
private final ExtendedMetaData _extendedMetadata;
private final Model _root;
private final ViewMetadataMapper _mapper;
/**
* @param uri
*/
public ViewMetadataGenerator(final String uri)
{
_root = MetadataFactory.eINSTANCE.createModel();
_root.setId(uri);
_root.setType("tagFile"); //$NON-NLS-1$
_resourceSet = new ResourceSetImpl();
_mapper = new ViewMetadataMapper();
_extendedMetadata = new BasicExtendedMetaData(_resourceSet
.getPackageRegistry());
// Register the appropriate resource factory to handle all file
// extensions.
//
_resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
.put(Resource.Factory.Registry.DEFAULT_EXTENSION,
new XMLResourceFactoryImpl());
}
/**
* The format of the strings should match OSGI version:
*
* MAJOR . MINOR . BUILD . QUALIFIER
*
* @param tagName
* @param typeInfo
* @param minJSFVersion
* the minimum JSF version, null for DEFAULT.
* @param minLibVersion
* the minimum library version, null for NONE.
*/
public void addTagToViewObjectMapping(final String tagName,
final ClassTypeInfo typeInfo, final String minJSFVersion,
final String minLibVersion)
{
final ClassTypeInfo_ metadata = _mapper.mapToMetadata(typeInfo);
if (metadata != null)
{
final TagToViewObjectMapping viewMapping =
ComponentMappingFactory.eINSTANCE.createTagToViewObjectMapping();
if (minJSFVersion != null)
{
viewMapping.setMinJSFVersion(minJSFVersion);
}
viewMapping.setMinLibraryVersion(minLibVersion);
viewMapping.setTypeInfo(metadata);
final TagMapping tagMapping = findOrCreateTagMapping(tagName);
tagMapping.getVersionedTagToViewMappings().add(viewMapping);
final Trait trait = MetadataFactory.eINSTANCE.createTrait();
trait.setId(ViewMetadataMapper.DEFAULT_MAPPING_TRAIT_ID);
trait.setValue(tagMapping);
final Entity entity = MetadataFactory.eINSTANCE.createEntity();
entity.setId(tagName);
entity.setType("tag"); //$NON-NLS-1$
entity.getTraits().add(trait);
_root.getChildEntities().add(entity);
}
}
private TagMapping findOrCreateTagMapping(final String tagName)
{
for (final Entity entity : (List<Entity>)_root.getChildEntities())
{
if (entity.getId().equals(tagName))
{
for (final Trait trait : (List<Trait>)entity.getTraits())
{
if (trait.getId().equals(ViewMetadataMapper.DEFAULT_MAPPING_TRAIT_ID))
{
return (TagMapping) trait.getValue();
}
}
}
}
return ComponentMappingFactory.eINSTANCE.createTagMapping();
}
/**
* @param out
* @throws IOException
*/
public void save(final OutputStream out) throws IOException
{
final Resource res = new XMLResourceImpl()
{
@Override
protected XMLHelper createXMLHelper()
{
return new XMLHelperImpl()
{
public String getHREF(EObject obj)
{
return ComponentMappingPackage.eNS_URI;
}
@Override
public EPackage getNoNamespacePackage()
{
return MetadataPackage.eINSTANCE;
}
};
}
};// _resourceSet.createResource(URI.createURI("foo.xml"));
res.getContents().add(_root);
// res.setURI(uri);
// resourceSet.getResources().add(res);
// setLoadOptions(res);
Map options = new HashMap();
options.put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
options.put(XMLResource.OPTION_EXTENDED_META_DATA, _extendedMetadata);
// options.put(XMLResource.OPTION_RESOURCE_HANDLER, res);
options.put(XMLResource.OPTION_LAX_FEATURE_PROCESSING, Boolean.TRUE);
options.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.FALSE);// turning
// this
// off
// so
// that
// res.getErrors()
// has
// values
// to
// check!
// bizarre
// that
// I
// should
// need
// to
// do
// this.
res.save(out, options);
}
// private void printHeader(final OutputStream out) throws IOException
// {
// final String header = "<md:metadatamodel \n"
// + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
// + "xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\""
// +
// "xmlns:md=\"http://org.eclipse.jst.jsf.common.metadata/metadata.ecore\""
// +
// "xmlns:mdt=\"http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore\"
// "
// +
// "xmlns:viewMap=\"http://org.eclipse.jst.jsf.core/componentMapping.ecore\""
// + "id=\"http://java.sun.com/jsf/html\""
// + "type\"tagFile\">";
// out.write(header.getBytes());
// }
}