/******************************************************************************* * Copyright 2010 Simon Mieth * * 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.kabeja.cocoon.generation; import java.io.FileInputStream; import java.io.IOException; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameterizable; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.caching.CacheableProcessingComponent; import org.apache.cocoon.environment.SourceResolver; import org.apache.cocoon.generation.AbstractGenerator; import org.apache.cocoon.util.HashUtil; import org.apache.excalibur.source.Source; import org.apache.excalibur.source.SourceValidity; import org.apache.excalibur.source.impl.validity.TimeStampValidity; import org.kabeja.dxf.DXFDocument; import org.kabeja.dxf.parser.DXFParser; import org.kabeja.parser.Handler; import org.kabeja.parser.ParseException; import org.kabeja.parser.Parser; import org.kabeja.parser.ParserBuilder; import org.kabeja.parser.SAXParserBuilder; import org.kabeja.svg.SVGGenerator; import org.kabeja.xml.SAXGenerator; import org.xml.sax.SAXException; /** * This generator parses DXF-Sources and transform the data to SVG. * * @author <a href="mailto:simon.mieth@gmx.de">Simon Mieth</a> * */ public class DXF2SVGGenerator extends AbstractGenerator implements CacheableProcessingComponent, Parameterizable { public final static String PARAMETER_CONFIG = "configfile"; public final static String PARAMETER_ENCODING = "encoding"; private SourceResolver resolver; private String src; protected Source inputSource; protected String config = null; protected boolean configured = false; protected Logger log; protected Parser parser; protected String encoding; /* * (non-Javadoc) * * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver, * java.util.Map, java.lang.String, * org.apache.avalon.framework.parameters.Parameters) */ public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par) throws ProcessingException, SAXException, IOException { super.setup(resolver, objectModel, src, par); // this is what we need this.resolver = resolver; this.src = src; this.inputSource = resolver.resolveURI(src); if (par.isParameter(PARAMETER_ENCODING)) { try { this.encoding = par.getParameter(PARAMETER_ENCODING); } catch (ParameterException e) { log.error("Setting up encoding error:" + e.getMessage()); this.encoding = DXFParser.DEFAULT_ENCODING; } } else { this.encoding = DXFParser.DEFAULT_ENCODING; } } /* * (non-Javadoc) * * @see org.apache.cocoon.generation.Generator#generate() */ public void generate() throws IOException, SAXException, ProcessingException { try { this.parser.parse(this.inputSource.getInputStream(), this.encoding); DXFDocument doc = parser.getDocument(); // the xmlConsumer the next component in // the pipeline from parent class SAXGenerator generator = new SVGGenerator(); generator.setProperties(new HashMap()); generator.generate(doc, this.xmlConsumer, null); // all is done release the source this.resolver.release(this.inputSource); // a little help for the GC ((Handler) this.parser).releaseDXFDocument(); doc = null; } catch (ParseException e) { throw new ProcessingException(e); } catch (IOException e) { throw new ProcessingException(e); } } public Serializable getKey() { // the key the sourc-uri this is unique if (this.inputSource.getLastModified() != 0) { return new Long(HashUtil.hash(this.inputSource.getURI())); } return new Long(0); } public SourceValidity getValidity() { // the validity is simple the last modified timestamp long modified = this.inputSource.getLastModified(); return new TimeStampValidity(modified); } /* * (non-Javadoc) * * @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(org.apache.avalon.framework.logger.Logger) */ public void enableLogging(Logger log) { this.log = log; } /* * (non-Javadoc) * * @see org.apache.avalon.framework.parameters.Parameterizable#parameterize(org.apache.avalon.framework.parameters.Parameters) */ public void parameterize(Parameters params) throws ParameterException { if (params.isParameter(PARAMETER_CONFIG)) { try { this.initParser(params.getParameter(PARAMETER_CONFIG)); } catch (Exception e) { log.error("Configuration failed:" + e.getMessage()); throw new ParameterException("DXFParserConfiguration"); } } else { initParser(); } } protected void initParser() { this.parser = ParserBuilder.createDefaultParser(); } protected void initParser(String config) throws Exception { // TODO use the sourceresolver this.parser = SAXParserBuilder.buildFromStream(new FileInputStream( config)); } }