001    /*
002     * $Id: DefaultValidationEventHandler.java,v 1.8 2003/02/28 21:44:25 ryans Exp $
003     *
004     * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
005     * 
006     * This software is the proprietary information of Sun Microsystems, Inc.  
007     * Use is subject to license terms.
008     * 
009     */
010    package javax.xml.bind.helpers;
011    
012    import java.net.URL;
013    import javax.xml.bind.ValidationEventHandler;
014    import javax.xml.bind.ValidationEvent;
015    import javax.xml.bind.ValidationEventLocator;
016    
017    import org.w3c.dom.Node;
018    
019    /**
020     * <p>
021     * This is the default validation event handler that will be used by the
022     * Unmarshaller and Validator if the client application doesn't specify 
023     * their own.
024     *
025     * <p>
026     * It will cause the unmarshal and validate operations to fail on the first
027     * error or fatal error.
028     *
029     * @author <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li></ul>
030     * @version $Revision: 1.8 $
031     * @see javax.xml.bind.Unmarshaller
032     * @see javax.xml.bind.Validator
033     * @see javax.xml.bind.ValidationEventHandler
034     * @since JAXB1.0
035     */
036    public class DefaultValidationEventHandler implements ValidationEventHandler {
037        
038        public boolean handleEvent( ValidationEvent event ) {
039            
040            if( event == null ) {
041                throw new IllegalArgumentException();
042            }
043    
044            // calculate the severity prefix and return value        
045            String severity = null;
046            boolean retVal = false;
047            switch ( event.getSeverity() ) {
048                case ValidationEvent.WARNING:
049                    severity = Messages.format( Messages.WARNING );
050                    retVal = true; // continue after warnings
051                    break;
052                case ValidationEvent.ERROR:
053                    severity = Messages.format( Messages.ERROR );
054                    retVal = false; // terminate after errors
055                    break;
056                case ValidationEvent.FATAL_ERROR:
057                    severity = Messages.format( Messages.FATAL_ERROR );
058                    retVal = false; // terminate after fatal errors
059                    break;
060                default:
061                    _assert( false, 
062                        Messages.format( Messages.UNRECOGNIZED_SEVERITY,
063                                         new Integer( event.getSeverity() ) ) );
064            }
065            
066            // calculate the location message
067            String location = getLocation( event );
068            
069            System.out.println( 
070                Messages.format( Messages.SEVERITY_MESSAGE,
071                                 severity,
072                                 event.getMessage(),
073                                 location ) );
074            
075            // fail on the first error or fatal error
076            return retVal;
077        }
078    
079        /**
080         * Calculate a location message for the event
081         * 
082         */
083        private String getLocation(ValidationEvent event) {
084            StringBuffer msg = new StringBuffer();
085            
086            ValidationEventLocator locator = event.getLocator();
087            
088            if( locator != null ) {
089                
090                URL url = locator.getURL();
091                Object obj = locator.getObject();
092                Node node = locator.getNode();
093                
094                if( url != null ) {
095                    msg.append( "line " + locator.getLineNumber() );
096                    msg.append( " of " + url.toExternalForm() );
097                } else if( obj != null ) {
098                    msg.append( " obj: " + obj.toString() );
099                } else if( node != null ) {
100                    msg.append( " node: " + node.toString() );
101                }
102            } else {
103                msg.append( Messages.format( Messages.LOCATION_UNAVAILABLE ) );
104            } 
105            
106            return msg.toString();
107        }
108    
109        
110        private static void _assert( boolean b, String msg ) {
111            if( !b ) {
112                throw new InternalError( msg );
113            }
114        }
115    }
116