/* * Copyright 2004-2012 the Seasar Foundation and the Others. * * 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.seasar.mayaa.impl.builder; import java.io.InputStream; import org.seasar.mayaa.builder.SpecificationBuilder; import org.seasar.mayaa.engine.specification.Specification; import org.seasar.mayaa.impl.CONST_IMPL; import org.seasar.mayaa.impl.ParameterAwareImpl; import org.seasar.mayaa.impl.util.IOUtil; import org.seasar.mayaa.impl.util.ObjectUtil; import org.seasar.mayaa.impl.util.xml.XMLReaderPool; import org.seasar.mayaa.source.SourceDescriptor; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; /** * @author Masataka Kurihara (Gluegent, Inc.) */ public class SpecificationBuilderImpl extends ParameterAwareImpl implements SpecificationBuilder, CONST_IMPL { private static final long serialVersionUID = -1272395705148798946L; private boolean _outputMayaaWhitespace = false; protected XMLReaderPool getXMLReaderPool(String systemID) { return XMLReaderPool.getPool(); } protected SpecificationNodeHandler createContentHandler( Specification specification) { SpecificationNodeHandler handler = new SpecificationNodeHandler(specification); handler.setOutputMayaaWhitespace(_outputMayaaWhitespace); return handler; } protected String getPublicID() { return URI_MAYAA + "/specification"; } protected void afterBuild(Specification specification) { // for TemplateBuilderImpl } public void build(Specification specification) { if (specification == null) { throw new IllegalArgumentException(); } SourceDescriptor source = specification.getSource(); if (source.exists()) { SpecificationNodeHandler handler = createContentHandler(specification); XMLReaderPool pool = getXMLReaderPool(source.getSystemID()); XMLReader xmlReader = pool.borrowXMLReader(handler, true, false, false); InputStream stream = source.getInputStream(); InputSource input = new InputSource(stream); input.setPublicId(getPublicID()); input.setSystemId(source.getSystemID()); try { xmlReader.parse(input); afterBuild(specification); } catch (Throwable t) { if (t instanceof RuntimeException) { throw (RuntimeException) t; } throw new RuntimeException( "build failed. " + source.getSystemID(), t); } finally { pool.returnXMLReader(xmlReader); IOUtil.close(stream); } } } // Parameterizable implements ------------------------------------ public void setParameter(String name, String value) { if ("outputMayaaWhitespace".equals(name)) { _outputMayaaWhitespace = ObjectUtil.booleanValue(value, true); } super.setParameter(name, value); } }