From 421e6ca6562999bc05bec00d6f9a4521843dcdf7 Mon Sep 17 00:00:00 2001 From: Benjamin Bentmann Date: Wed, 27 May 2009 20:28:12 +0000 Subject: [PATCH] o Added dedicated exception for POM parsing errors git-svn-id: https://svn.apache.org/repos/asf/maven/components/branches/MNG-2766@779299 13f79535-47bb-0310-9956-ffa450edef68 --- .../maven/model/io/DefaultModelReader.java | 4 +- .../maven/model/io/ModelParseException.java | 93 +++++++++++++++++++ .../apache/maven/model/io/ModelReader.java | 9 +- 3 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 maven-model-builder/src/main/java/org/apache/maven/model/io/ModelParseException.java diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/io/DefaultModelReader.java b/maven-model-builder/src/main/java/org/apache/maven/model/io/DefaultModelReader.java index 68f167ede6..1879db90ba 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/io/DefaultModelReader.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/io/DefaultModelReader.java @@ -72,7 +72,7 @@ public Model read( Reader input, Map options ) } catch ( XmlPullParserException e ) { - throw (IOException) new IOException( "Failed to parse POM" ).initCause( e ); + throw new ModelParseException( e.getMessage(), e, e.getLineNumber(), e.getColumnNumber() ); } finally { @@ -95,7 +95,7 @@ public Model read( InputStream input, Map options ) } catch ( XmlPullParserException e ) { - throw (IOException) new IOException( "Failed to parse POM" ).initCause( e ); + throw new ModelParseException( e.getMessage(), e, e.getLineNumber(), e.getColumnNumber() ); } finally { diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelParseException.java b/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelParseException.java new file mode 100644 index 0000000000..1b73bd7d78 --- /dev/null +++ b/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelParseException.java @@ -0,0 +1,93 @@ +package org.apache.maven.model.io; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.IOException; + +/** + * Signals a failure to parse the POM due to invalid syntax (e.g. non-wellformed XML or unknown elements). + * + * @author Benjamin Bentmann + */ +public class ModelParseException + extends IOException +{ + + /** + * The one-based index of the line containing the error. + */ + private int lineNumber; + + /** + * The one-based index of the column containing the error. + */ + private int columnNumber; + + /** + * Creates a new parser exception with the specified details. + * + * @param message The error message, may be {@code null}. + * @param lineNumber The one-based index of the line containing the error or {@code -1} if unknown. + * @param columnNumber The one-based index of the column containing the error or {@code -1} if unknown. + */ + public ModelParseException( String message, int lineNumber, int columnNumber ) + { + super( message ); + this.lineNumber = lineNumber; + this.columnNumber = columnNumber; + } + + /** + * Creates a new parser exception with the specified details. + * + * @param message The error message, may be {@code null}. + * @param cause The nested cause of this error, may be {@code null}. + * @param lineNumber The one-based index of the line containing the error or {@code -1} if unknown. + * @param columnNumber The one-based index of the column containing the error or {@code -1} if unknown. + */ + public ModelParseException( String message, Throwable cause, int lineNumber, int columnNumber ) + { + super( message ); + initCause( cause ); + this.lineNumber = lineNumber; + this.columnNumber = columnNumber; + } + + /** + * Gets the one-based index of the line containing the error. + * + * @return The one-based index of the line containing the error or a non-positive value if unknown. + */ + public int getLineNumber() + { + return lineNumber; + } + + /** + * Gets the one-based index of the column containing the error. + * + * @return The one-based index of the column containing the error or non-positive value if unknown. + */ + public int getColumnNumber() + { + return columnNumber; + } + +} diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelReader.java b/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelReader.java index 9a4735256e..ea6f62976b 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelReader.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelReader.java @@ -48,9 +48,10 @@ public interface ModelReader * @param options The options to use for deserialization, may be {@code null} to use the default values. * @return The deserialized model, never {@code null}. * @throws IOException If the model could not be deserialized. + * @throws ModelParseException If the input format could not be parsed. */ Model read( File input, Map options ) - throws IOException; + throws IOException, ModelParseException; /** * Reads the model from the specified character reader. The reader will be automatically closed before the method @@ -60,9 +61,10 @@ Model read( File input, Map options ) * @param options The options to use for deserialization, may be {@code null} to use the default values. * @return The deserialized model, never {@code null}. * @throws IOException If the model could not be deserialized. + * @throws ModelParseException If the input format could not be parsed. */ Model read( Reader input, Map options ) - throws IOException; + throws IOException, ModelParseException; /** * Reads the model from the specified byte stream. The stream will be automatically closed before the method @@ -72,8 +74,9 @@ Model read( Reader input, Map options ) * @param options The options to use for deserialization, may be {@code null} to use the default values. * @return The deserialized model, never {@code null}. * @throws IOException If the model could not be deserialized. + * @throws ModelParseException If the input format could not be parsed. */ Model read( InputStream input, Map options ) - throws IOException; + throws IOException, ModelParseException; }