blob: cadde2c8aba1e052e68e08b9252fe952002d05dc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 Lablicate GmbH 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:
* Christoph Läubrich - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.pomless;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.ModelParseException;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
*
* Baseclass for models derived from xml sources
*/
public abstract class AbstractXMLTychoMapping extends AbstractTychoMapping {
private static final DocumentBuilderFactory FACTORY = DocumentBuilderFactory.newInstance();
@Override
protected void initModel(Model model, Reader artifactReader, File artifactFile)
throws ModelParseException, IOException {
try {
DocumentBuilder parser = FACTORY.newDocumentBuilder();
Document doc = parser.parse(new InputSource(artifactReader));
doc.setDocumentURI(artifactFile.toURI().toASCIIString());
Element element = doc.getDocumentElement();
initModelFromXML(model, element, artifactFile);
} catch (ParserConfigurationException e) {
throw new IOException("parser failed", e);
} catch (SAXException e) {
int lineNumber = -1;
int columnNumber = -1;
if (e instanceof SAXParseException) {
SAXParseException parseException = (SAXParseException) e;
lineNumber = parseException.getLineNumber();
columnNumber = parseException.getColumnNumber();
}
throw new ModelParseException(e.getMessage(), lineNumber, columnNumber, e);
}
}
protected abstract void initModelFromXML(Model model, Element xml, File artifactFile)
throws ModelParseException, IOException;
protected static String getRequiredXMLAttributeValue(Element element, String attributeName)
throws ModelParseException {
String value = getXMLAttributeValue(element, attributeName);
if (value == null) {
throw new ModelParseException(String.format("missing or empty '%s' attribute in element '%s' (uri=%s)",
attributeName, element.getNodeName(), element.getOwnerDocument().getDocumentURI()), -1, -1);
}
return value;
}
protected static String getXMLAttributeValue(Element element, String attributeName) {
Attr idNode = element.getAttributeNode(attributeName);
if (idNode != null) {
String value = idNode.getValue();
if (value != null && !value.isEmpty()) {
return value;
}
}
return null;
}
}