001 /*
002 * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation. Sun designates this
008 * particular file as subject to the "Classpath" exception as provided
009 * by Sun in the LICENSE file that accompanied this code.
010 *
011 * This code is distributed in the hope that it will be useful, but WITHOUT
012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014 * version 2 for more details (a copy is included in the LICENSE file that
015 * accompanied this code).
016 *
017 * You should have received a copy of the GNU General Public License version
018 * 2 along with this work; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020 *
021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022 * CA 95054 USA or visit www.sun.com if you need additional information or
023 * have any questions.
024 */
025 package javax.xml.bind.helpers;
026
027 import org.w3c.dom.Node;
028
029 import javax.xml.bind.ValidationEvent;
030 import javax.xml.bind.ValidationEventHandler;
031 import javax.xml.bind.ValidationEventLocator;
032 import java.net.URL;
033
034 /**
035 * <p>
036 * JAXB 1.0 only default validation event handler. This is the default
037 * handler for all objects created from a JAXBContext that is managing
038 * schema-derived code generated by a JAXB 1.0 binding compiler.
039 *
040 * <p>
041 * This handler causes the unmarshal and validate operations to fail on the first
042 * error or fatal error.
043 *
044 * <p>
045 * This handler is not the default handler for JAXB mapped classes following
046 * JAXB 2.0 or later versions. Default validation event handling has changed
047 * and is specified in {@link javax.xml.bind.Unmarshaller} and
048 * {@link javax.xml.bind.Marshaller}.
049 *
050 * @author <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li></ul>
051 * @version $Revision: 1.4 $
052 * @see javax.xml.bind.Unmarshaller
053 * @see javax.xml.bind.Validator
054 * @see javax.xml.bind.ValidationEventHandler
055 * @since JAXB1.0
056 */
057 public class DefaultValidationEventHandler implements
058 ValidationEventHandler {
059
060 public boolean handleEvent(ValidationEvent event) {
061
062 if (event == null) {
063 throw new IllegalArgumentException();
064 }
065
066 // calculate the severity prefix and return value
067 String severity = null;
068 boolean retVal = false;
069 switch (event.getSeverity()) {
070 case ValidationEvent.WARNING:
071 severity = Messages.format(Messages.WARNING);
072 retVal = true; // continue after warnings
073 break;
074 case ValidationEvent.ERROR:
075 severity = Messages.format(Messages.ERROR);
076 retVal = false; // terminate after errors
077 break;
078 case ValidationEvent.FATAL_ERROR:
079 severity = Messages.format(Messages.FATAL_ERROR);
080 retVal = false; // terminate after fatal errors
081 break;
082 default:
083 assert false : Messages
084 .format(Messages.UNRECOGNIZED_SEVERITY, event
085 .getSeverity());
086 }
087
088 // calculate the location message
089 String location = getLocation(event);
090
091 System.out.println(Messages.format(Messages.SEVERITY_MESSAGE,
092 severity, event.getMessage(), location));
093
094 // fail on the first error or fatal error
095 return retVal;
096 }
097
098 /**
099 * Calculate a location message for the event
100 *
101 */
102 private String getLocation(ValidationEvent event) {
103 StringBuffer msg = new StringBuffer();
104
105 ValidationEventLocator locator = event.getLocator();
106
107 if (locator != null) {
108
109 URL url = locator.getURL();
110 Object obj = locator.getObject();
111 Node node = locator.getNode();
112 int line = locator.getLineNumber();
113
114 if (url != null || line != -1) {
115 msg.append("line " + line);
116 if (url != null)
117 msg.append(" of " + url);
118 } else if (obj != null) {
119 msg.append(" obj: " + obj.toString());
120 } else if (node != null) {
121 msg.append(" node: " + node.toString());
122 }
123 } else {
124 msg.append(Messages.format(Messages.LOCATION_UNAVAILABLE));
125 }
126
127 return msg.toString();
128 }
129 }
|