Example usage for org.apache.commons.digester Digester pop

List of usage examples for org.apache.commons.digester Digester pop

Introduction

In this page you can find the example usage for org.apache.commons.digester Digester pop.

Prototype

public Object pop(String stackName) 

Source Link

Document

Pops (gets and removes) the top object from the stack with the given name.

Note: a stack is considered empty if no objects have been pushed onto it yet.

Usage

From source file:org.photovault.imginfo.xml.XmlImporter.java

/**
 Import data from XML file according to current settings in this object.
 *///from   w w w .j  a  va 2  s . c o  m
public void importData() {
    Digester digester = new Digester();
    digester.push(this); // Push controller servlet onto the stack
    digester.setValidating(false);
    digester.addFactoryCreate("*/folders/folder", new FolderFactory(true));
    digester.addFactoryCreate("*/folder/folder", new FolderFactory(true));
    digester.addCallMethod("*/folder/name", "setName", 0);
    digester.addCallMethod("*/folder/description", "setDescription", 0);

    // PhotoInfo mappings
    digester.addFactoryCreate("*/photos/photo", new PhotoFactory());
    // After the photo  is ready, inform listeners  if a new photo was created.
    digester.addRule("*/photos/photo", new Rule() {
        @Override
        public void end(String namespace, String name) {
            Boolean isCreatingNew = (Boolean) digester.pop(STACK_CREATING_NEW);
            if (isCreatingNew.booleanValue()) {
                photoCount++;
                fireObjectImportedEvent(digester.peek());
            }
        }
    });
    digester.addCallMethod("*/photos/photo/shooting-place", "setShootingPlace", 0);
    digester.addCallMethod("*/photos/photo/photographer", "setPhotographer", 0);
    digester.addCallMethod("*/photos/photo/camera", "setCamera", 0);
    digester.addCallMethod("*/photos/photo/lens", "setLens", 0);
    digester.addCallMethod("*/photos/photo/film", "setFilm", 0);
    digester.addCallMethod("*/photos/photo/orig-fname", "setOrigFname", 0);
    digester.addCallMethod("*/photos/photo/description", "setDesc", 0);
    digester.addCallMethod("*/photos/photo/tech-notes", "setTechNotes", 0);
    digester.addCallMethod("*/photos/photo/f-stop", "setFStop", 0, new Class[] { Double.class });
    digester.addCallMethod("*/photos/photo/shutter-speed", "setShutterSpeed", 0, new Class[] { Double.class });
    digester.addCallMethod("*/photos/photo/focal-length", "setFocalLength", 0, new Class[] { Double.class });
    digester.addCallMethod("*/photos/photo/quality", "setQuality", 0, new Class[] { Integer.class });
    digester.addCallMethod("*/photos/photo/film-speed", "setFilmSpeed", 0, new Class[] { Integer.class });

    digester.addFactoryCreate("*/photos/photo/shoot-time", new FuzzyDateFactory());
    digester.addSetNext("*/photos/photo/shoot-time", "setFuzzyShootTime");

    // Crop settings
    digester.addCallMethod("*/photos/photo/crop", "setPrefRotation", 1, new Class[] { Double.class });
    digester.addCallParam("*/photos/photo/crop", 0, "rot");
    digester.addFactoryCreate("*/photos/photo/crop", new RectangleFactory());
    digester.addSetNext("*/photos/photo/crop", "setCropBounds");

    /* 
     Raw conversion setting mappings. All of these expect that a RawSettingsFactory
     is the topmost object in Digester stack. Note that in practice there must be 
     and explicit rule for each raw setting field since the rule that
     instantates the raw setting object & assign it to the parent object will 
     override this.
     */
    digester.addObjectCreate("*/raw-conversion", RawSettingsFactory.class);
    digester.addCallMethod("*/raw-conversion/whitepoint", "setWhite", 0, new Class[] { Integer.class });
    digester.addCallMethod("*/raw-conversion/blackpoint", "setBlack", 0, new Class[] { Integer.class });
    digester.addCallMethod("*/raw-conversion/ev-corr", "setEvCorr", 0, new Class[] { Double.class });
    digester.addCallMethod("*/raw-conversion/hlight-corr", "setHlightComp", 0, new Class[] { Double.class });
    digester.addRule("*/raw-conversion/color-balance", new Rule() {
        @Override
        public void begin(String namespace, String name, Attributes attrs) {
            String rgStr = attrs.getValue("red-green-ratio");
            String bgStr = attrs.getValue("blue-green-ratio");
            double bg = 1.0;
            double rg = 1.0;
            try {
                bg = Double.parseDouble(bgStr);
                rg = Double.parseDouble(rgStr);
            } catch (NumberFormatException ex) {
                digester.createSAXException(ex);
            }
            RawSettingsFactory f = (RawSettingsFactory) digester.peek();
            f.setRedGreenRation(rg);
            f.setBlueGreenRatio(bg);
        }
    });
    digester.addRule("*/raw-conversion/daylight-color-balance", new Rule() {
        @Override
        public void begin(String namespace, String name, Attributes attrs) {
            String rgStr = attrs.getValue("red-green-ratio");
            String bgStr = attrs.getValue("blue-green-ratio");
            double bg = 1.0;
            double rg = 1.0;

            try {
                bg = Double.parseDouble(bgStr);
                rg = Double.parseDouble(rgStr);
            } catch (NumberFormatException ex) {
                digester.createSAXException(ex);
            }
            RawSettingsFactory f = (RawSettingsFactory) digester.peek();
            f.setDaylightMultipliers(new double[] { rg, 1.0, bg });
        }
    });
    digester.addRuleSet(new ChannelMapRuleSet("*/photo/"));
    digester.addRule("*/photo/color-mapping", new Rule() {
        @Override
        public void end(String namespace, String name) {
            PhotoInfo p = (PhotoInfo) digester.peek(1);
            ChannelMapOperationFactory f = (ChannelMapOperationFactory) digester.peek();
            p.setColorChannelMapping(f.create());
        }
    });

    digester.addObjectCreate("*/photo/raw-conversion", RawSettingsFactory.class);
    digester.addRule("*/photo/raw-conversion", new Rule() {
        @Override
        public void end(String namespace, String name) {
            PhotoInfo p = (PhotoInfo) digester.peek(1);
            RawSettingsFactory f = (RawSettingsFactory) digester.peek();
            try {
                p.setRawSettings(f.create());
            } catch (PhotovaultException ex) {
                digester.createSAXException(ex);
            }
        }
    });

    // Instance mappings
    digester.addFactoryCreate("*/photo/instances/instance", new InstanceFactory());
    digester.addCallMethod("*/instance/file-size", "setFileSize", 0, new Class[] { Long.class });
    digester.addCallMethod("*/instance/width", "setWidth", 0, new Class[] { Integer.class });
    digester.addCallMethod("*/instance/height", "setHeight", 0, new Class[] { Integer.class });
    digester.addCallMethod("*/instance/crop", "setRotated", 1, new Class[] { Double.class });
    digester.addCallParam("*/instance/crop", 0, "rot");
    digester.addFactoryCreate("*/instance/crop", new RectangleFactory());
    digester.addSetNext("*/instance/crop", "setCropBounds");
    digester.addRule("*/instance/hash", new Rule() {
        @Override
        public void body(String namespace, String name, String text) {
            /*                
                            byte[] hash = Base64.decode( text );
                            ImageInstance i = (ImageInstance) digester.peek();
                            i.setHash( hash );
            */
        }
    });
    digester.addRuleSet(new ChannelMapRuleSet("*/instance/"));
    digester.addRule("*/instance/color-mapping", new Rule() {
        @Override
        public void end(String namespace, String name) {
            /*
                            ImageInstance i = (ImageInstance) digester.peek(1);
                            ChannelMapOperationFactory f = 
                (ChannelMapOperationFactory) digester.peek();
                            i.setColorChannelMapping( f.create() );                
            */
        }
    });
    // Raw conversion parsing was already specified earlier. We just need a 
    // method for binding the RawConversionSettings object to instance
    digester.addObjectCreate("*/instance/raw-conversion", RawSettingsFactory.class);
    digester.addRule("*/instance/raw-conversion", new Rule() {
        @Override
        public void end(String namespace, String name) {
            /*
                            ImageInstance i = (ImageInstance)digester.peek(1);
                            RawSettingsFactory f = (RawSettingsFactory) digester.peek();
                            try {
            i.setRawSettings( f.create() );
                            } catch (PhotovaultException ex) {
            digester.createSAXException( ex );
                            }
            */
        }
    });
    /*
     TODO: import information about image locations. In first phase, this
     can be done by indexing images as an external volume...
    */

    digester.addSetNext("*/photo/instances/instance", "addInstance");

    // folder handling
    digester.addFactoryCreate("*/photos/photo/folders/folder-ref", new FolderFactory(false));
    digester.addSetTop("*/photos/photo/folders/folder-ref", "addPhoto");

    fireStatusChangeEvent(IMPORTING_STARTED);
    try {
        digester.parse(reader);
    } catch (SAXException ex) {
        fireErrorEvent(ex.getMessage());
        ex.printStackTrace();
    } catch (IOException ex) {
        fireErrorEvent(ex.getMessage());
        ex.printStackTrace();
    }
    fireStatusChangeEvent(IMPORTING_COMPLETED);
}