Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 1&1 Internet AG, http://www.1and1.org
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU Lesser General Public License as published by
   * the Free Software Foundation; either version 2 of the License,
   * or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  * See the GNU Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 package net.sf.beezle.sushi.metadata.xml;
 
 
 import java.util.List;
 import java.util.Map;
 
 public class Loader extends DefaultHandler {
     private Locator locator;
     private final Type type;
     private final SAXParser parser;
     private final List<Elementelements;
     private Object result;
    
map's id's to Objects
 
     private Map<StringObjectstorage;
     private List<SAXExceptionexceptions;
 
     public static Loader create(Type type) {
         // No validation - because it's generally impossible: the complete schema
         // is unknown because users my specify arbitrary types. Instead, the loader
         // performs proper validation - all unknown elements/attributes are rejected.
         return new Loader(type, Builder.createSAXParser());
     }
 
     public Loader(Type typeSAXParser parser) {
         this. = type;
         this. = parser;
         this. = new ArrayList<Element>();
         this. = null;
     }
 
     public Object run(InputSource srcthrows LoaderExceptionIOException {
         .clear();
 
          = null;
          = new HashMap<StringObject>();
          = new ArrayList<SAXException>();
         try {
             .parse(srcthis);
         } catch (SAXParseException e) {
             .add(e);
         } catch (SAXException e) {
             .add(e);
         }
         LoaderException.check(src);
         if (.size() != 0) {
             throw new RuntimeException();
         }
         return ;
     }
 
     //-- SAX parser implementation
     
     @Override
     public void setDocumentLocator(Locator locator) {
         this. = locator;
     }
       
     @Override
     public void startElement(String uriString localNameString qNameAttributes attrsthrows SAXLoaderException {
         Element parent;
         Item<?> child;
         Element started;
         int length;
         String name;
         String value;
         String explicitType;
         
         check(urilocalName);
         explicitType = attrs.getValue("type");
        if (.size() == 0) {
            // this is the root element - the element name doesn't matter
            started = Element.create(nulloverride(explicitType));
        } else {
            parent = peek();
            child = parent.lookup(qName);
            if (child == null) {
                // cannot recover
                throw new SAXLoaderException("unknown element '" + qName + "'");
            }
            started = Element.create(childoverride(explicitTypechild.getType()));
        }
        .add(started);
        
        length = attrs.getLength();
        for (int i = 0; i < lengthi++) {
            name = attrs.getQName(i);
            value = attrs.getValue(i);
            if (name.equals("id")) {
                started.id = value;
            } else if (name.equals("idref")) {
                started.idref = value;
            } else if (name.equals("type")) {
                // already processed
            } else {
                loaderException("unexected attribute " + name);
            }
        }
    }
    private Type override(String explicitTypeType type) {
        if (explicitType != null) {
            try {
                return type.getSchema().type(Class.forName(explicitType));
            } catch (ClassNotFoundException e) {
                loaderException("unknown type: " + explicitType);
                return type;
            }
        } else {
            return type;
        }
    }
    @Override
    public void endElement(String uriString localNameString qName) {
        Element child;
        Object childObject;
        check(urilocalName);
        child = .remove(.size() - 1);
        childObject = child.done();
        if (.size() == 0) {
             = childObject;
        } else {
            peek().addChild(child.getOwner(), childObject);
        }
    }
    
    @Override
    public void characters(char[] chint startint end) {
        if (!peek().addContent(chstartend)) {
            loaderException("unexpected content");
        }
    }
    @Override
    public void ignorableWhitespace(char[] chint startint end) {
        // ignore
    }
    
    //-- exception handling
    
    @Override
    public void warning(SAXParseException e) {
        .add(e);
    }

    
called if the document is not valid
    @Override
    public void error(SAXParseException e) {
        .add(e);
    }

    
called if the document is not well-formed. Clears all other exceptions an terminates parsing
    @Override
    public void fatalError(SAXParseException ethrows SAXParseException {
        // clear all other exceptions an terminate
        .clear();
        throw e;
    }
    private void check(String uriString localName) {
        if (!"".equals(uri)) {
            loaderException("unexpected uri: " + uri);
        }
        if (!"".equals(localName)) {
            loaderException("unexpected localName: " + localName);
        }
    }
    
    
called for loader exceptions
    private void loaderException(String msg) {
        .add(new SAXLoaderException(msg));
    }
    //--
    private Element peek() {
        return .get(.size() - 1);
    }
New to GrepCode? Check out our FAQ X