/**
* <copyright>
*
* Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands) 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:
* Martin Taal
* </copyright>
*
* $Id: XmlPersistenceMapper.java,v 1.5 2008/05/27 07:42:09 mtaal Exp $
*/
package org.eclipse.emf.teneo.annotations.xml;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.emf.teneo.annotations.pamodel.PAnnotatedModel;
import org.eclipse.emf.teneo.extension.ExtensionManager;
import org.eclipse.emf.teneo.extension.ExtensionManagerAware;
import org.eclipse.emf.teneo.extension.ExtensionPoint;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
/**
* Populates and configures a PAnnotatedModel using an XML persistence mapping file.
*/
public class XmlPersistenceMapper implements ExtensionPoint, ExtensionManagerAware {
/** The inputStream containing the xml document */
private InputStream xmlMapping;
/** The logger */
protected static final Log log = LogFactory.getLog(XmlPersistenceMapper.class);
private ExtensionManager extensionManager;
/**
* Sets the InputStream containing the XML mapping.
*
* @param xmlMapping
* The InputStream containing the XML persistence mapping. Closed automatically by
* {@link #applyPersistenceMapping(PAnnotatedModel)}.
*/
public void setXmlMapping(InputStream xmlMapping) {
if (xmlMapping == null) {
throw new IllegalArgumentException("XML mapping cannot be null.");
}
this.xmlMapping = xmlMapping;
}
/**
* Applies the XML persistence mapping to a PAnnotatedModel.
*
* @throws IllegalStateException
* if the XML mapping was not configured.
* @throws RuntimeException
* If there was an error reading or parsing the XML file.
*/
public void applyPersistenceMapping(PAnnotatedModel pAnnotatedModel) {
if (xmlMapping == null) {
throw new IllegalStateException("XML mapping not configured.");
}
SAXParser saxParser;
try {
final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
saxParserFactory.setNamespaceAware(true);
saxParserFactory.setValidating(true);
saxParser = saxParserFactory.newSAXParser();
} catch (ParserConfigurationException e) {
throw new ParseXMLAnnotationsException(e);
} catch (SAXException e) {
throw new ParseXMLAnnotationsException(e);
}
try {
try {
saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", this.getClass()
.getResourceAsStream("persistence-mapping.xsd"));
} catch (SAXNotRecognizedException s) {
log.warn("Properties schemaSource and/or schemaLanguage are not supported, setvalidating=false. "
+ "Probably running 1.4 with an old crimson sax parser. Ignoring this and continuing with "
+ "a non-validating and name-space-aware sax parser");
final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
saxParserFactory.setNamespaceAware(true);
saxParserFactory.setValidating(false);
saxParser = saxParserFactory.newSAXParser();
}
final XmlPersistenceContentHandler xmlContentHandler =
extensionManager.getExtension(XmlPersistenceContentHandler.class);
xmlContentHandler.setPAnnotatedModel(pAnnotatedModel);
xmlContentHandler.setPrefix(getPrefix());
xmlContentHandler.setSchema(this.getClass().getResourceAsStream("persistence-mapping.xsd"));
saxParser.parse(xmlMapping, xmlContentHandler);
} catch (SAXException e) {
throw new ParseXMLAnnotationsException(e);
} catch (IOException e) {
throw new ParseXMLAnnotationsException(e);
} catch (ParserConfigurationException e) {
throw new ParseXMLAnnotationsException(e);
} finally {
try {
xmlMapping.close();
} catch (IOException e) {
// ignoring io exception
}
}
}
/** Return a prefix which are used by a subpackage to make efeatures unique */
protected String getPrefix() {
return "";
}
/**
* @return the extensionManager
*/
public ExtensionManager getExtensionManager() {
return extensionManager;
}
/**
* @param extensionManager
* the extensionManager to set
*/
public void setExtensionManager(ExtensionManager extensionManager) {
this.extensionManager = extensionManager;
}
}