com.jaspersoft.ireport.designer.compiler.xml.SourceTraceDigester.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.ireport.designer.compiler.xml.SourceTraceDigester.java

Source

/*
 * iReport - Visual Designer for JasperReports.
 * Copyright (C) 2002 - 2009 Jaspersoft Corporation. All rights reserved.
 * http://www.jaspersoft.com
 *
 * Unless you have purchased a commercial license agreement from Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of iReport.
 *
 * iReport is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * iReport 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with iReport. If not, see <http://www.gnu.org/licenses/>.
 */
package com.jaspersoft.ireport.designer.compiler.xml;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import net.sf.jasperreports.engine.xml.JRXmlDigester;

import org.apache.commons.digester.FactoryCreateRule;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

/**
 * @author Lucian Chirita (lucianc@users.sourceforge.net)
 * @version $Id: SourceTraceDigester.java 22 2007-03-08 15:18:26Z lucianc $
 */
public class SourceTraceDigester extends JRXmlDigester {

    private final Map sourceLocations = new HashMap();

    protected static class ElementStack {
        protected static class ElementInfo {
            private String path;
            private final Map childrenCounts = new HashMap();

            @SuppressWarnings("unchecked")
            public int addChild(String name) {
                Integer last = (Integer) childrenCounts.get(name);
                int position = last == null ? 1 : (last.intValue() + 1);
                childrenCounts.put(name, new Integer(position));
                return position;
            }

            public String getPath() {
                return path;
            }

            public void setPath(String path) {
                this.path = path;
            }
        }

        private final LinkedList infoStack = new LinkedList();

        @SuppressWarnings("unchecked")
        public void pushElement(String elementName) {
            String currentPath;
            if (infoStack.isEmpty()) {
                currentPath = "/" + elementName;
            } else {
                ElementInfo parentInfo = (ElementInfo) infoStack.getFirst();
                int position = parentInfo.addChild(elementName);
                currentPath = parentInfo.getPath() + "/" + elementName + "[" + position + "]";
            }

            ElementInfo info = new ElementInfo();
            info.setPath(currentPath);

            infoStack.addFirst(info);
        }

        public void popElement() {
            infoStack.removeFirst();
        }

        public String getCurrentPath() {
            ElementInfo info = (ElementInfo) infoStack.getFirst();
            return info.getPath();
        }
    }

    private final ElementStack elementStack = new ElementStack();

    public SourceTraceDigester() {
        super();
    }

    public SourceTraceDigester(XMLReader xmlReader) {
        super(xmlReader);
    }

    public void addFactoryCreate(String pattern, Class clazz) {
        addRule(pattern, new SourceTraceFactoryCreateRule(clazz));
    }

    public void addFactoryCreate(String pattern, String className) {
        addRule(pattern, new SourceTraceFactoryCreateRule(className));
    }

    public void addFactoryCreate(String pattern, Class clazz, String attributeName) {
        addRule(pattern, new SourceTraceFactoryCreateRule(clazz, attributeName));
    }

    public void addFactoryCreate(String pattern, String className, String attributeName) {
        addRule(pattern, new SourceTraceFactoryCreateRule(className, attributeName));
    }

    public SourceLocation getLocation(Object instance) {
        return (SourceLocation) sourceLocations.get(instance);
    }

    public void startElement(String namespaceURI, String localName, String qName, Attributes list)
            throws SAXException {
        String name = localName != null && localName.length() > 0 ? localName : qName;
        elementStack.pushElement(name);

        super.startElement(namespaceURI, localName, qName, list);
    }

    public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
        super.endElement(namespaceURI, localName, qName);

        elementStack.popElement();
    }

    @SuppressWarnings("unchecked")
    protected void objectCreated() {
        Object instance = peek();
        if (instance != null && !sourceLocations.containsKey(instance)) {
            SourceLocation location = currentLocation();
            sourceLocations.put(instance, location);
        }
    }

    protected SourceLocation currentLocation() {
        Locator documentLocator = getDocumentLocator();
        SourceLocation location = new SourceLocation();
        location.setLineNumber(documentLocator.getLineNumber());
        location.setColumnNumber(documentLocator.getColumnNumber());
        location.setXPath(elementStack.getCurrentPath());
        return location;
    }

    protected class SourceTraceFactoryCreateRule extends FactoryCreateRule {

        public SourceTraceFactoryCreateRule(Class clazz) {
            super(clazz, false);
        }

        public SourceTraceFactoryCreateRule(String className) {
            super(className, false);
        }

        public SourceTraceFactoryCreateRule(Class clazz, String attributeName) {
            super(clazz, attributeName, false);
        }

        public SourceTraceFactoryCreateRule(String className, String attributeName) {
            super(className, attributeName, false);
        }

        public void begin(String namespace, String name, Attributes attributes) throws Exception {
            super.begin(namespace, name, attributes);

            objectCreated();
        }

    }
}