/** * Copyright 2011 meltmedia * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.xchain.framework.digester; import org.apache.commons.digester.Digester; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; import org.xchain.framework.digester.strategy.RuleLoadingNewDigesterFilter; import org.xchain.framework.lifecycle.XmlFactoryLifecycle; /** * @author Christian Trimble * @author Mike Moulton */ public class DigesterFactory { public static DigesterFactory instance; static { instance = new DigesterFactory(); } public static DigesterFactory getInstance() { return instance; } protected NewDigesterStrategy newDigesterStrategy; public synchronized void addNewDigesterFilter( NewDigesterFilter newDigesterFilter ) { NewDigesterFilter lastFilter = newDigesterFilter; // find the last filter in the chain. while( lastFilter.getParent() != null && lastFilter.getParent() instanceof NewDigesterFilter ) { lastFilter = (NewDigesterFilter)lastFilter.getParent(); } // if the last filter in the chain has a null parent, then set the current new digester strategy // as the parent. if( lastFilter.getParent() == null ) { lastFilter.setParent( newDigesterStrategy ); } // assign the newDigesterFilter as the newDigesterStrategy for the factory. newDigesterStrategy = newDigesterFilter; } public synchronized NewDigesterStrategy getNewDigesterStrategy() { return newDigesterStrategy; } public synchronized void setNewDigesterStrategy( NewDigesterStrategy newDigesterStrategy ) { this.newDigesterStrategy = newDigesterStrategy; } public DigesterFactory() { setNewDigesterStrategy(new RootNewDigesterStrategy()); addNewDigesterFilter(new RuleLoadingNewDigesterFilter()); } public Digester newDigester( XMLReader xmlReader ) throws Exception { return getNewDigesterStrategy().newDigester(xmlReader); } public Digester newDigester() throws Exception { // create a new xml reader. XMLReader reader = XmlFactoryLifecycle.newXmlReader(); // create a new digester with this xml reader. return this.newDigester( reader ); } /** * This strategy just creates a new digester. */ public static class RootNewDigesterStrategy implements NewDigesterStrategy { public Digester newDigester( XMLReader xmlReader ) throws Exception { Digester digester = null; if( xmlReader != null ) { digester = new Digester( xmlReader ); } else { digester = new Digester(); } return digester; } } }