/*******************************************************************************
* 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.dxf.generator;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.kabeja.DraftDocument;
import org.kabeja.dxf.generator.conf.DXFProfile;
import org.kabeja.io.GenerationException;
import org.kabeja.processing.Generator;
import org.kabeja.util.Constants;
public class DXFGenerator implements Generator {
public static final String MIME_TYPE = "application/cad";
public static final String DXF_SUFFIX = "dxf";
public static final String DEFAUL_CONTEXT = "/profiles.xml";
protected DXFGeneratorManager manager;
protected DXFGenerationContext generationContext;
protected Map properties = new HashMap();
public DXFGenerator(DXFGenerationContext context) {
this.generationContext = context;
}
public DXFGenerator() {
this(null);
}
/*
* (non-Javadoc)
*
* @see org.kabeja.io.Generator#generate(org.kabeja.dxf.DXFDocument,
* java.io.OutputStream)
*/
public void generate(DraftDocument doc, Map<String, Object> context,
OutputStream out) throws GenerationException {
String profileName = null;
if (context.containsKey(DXFGenerationContext.ATTRIBUTE_PROFILE)) {
profileName = context.get(DXFGenerationContext.ATTRIBUTE_PROFILE)
.toString();
} else if (this.generationContext
.hasAttribute(DXFGenerationContext.ATTRIBUTE_DEFAULT_PROFILE)) {
profileName = this.generationContext.getAttribute(
DXFGenerationContext.ATTRIBUTE_DEFAULT_PROFILE).toString();
}
if (this.generationContext.getDXFGeneratorManager().hasDXFProfile(
profileName)) {
DXFProfile profile = this.generationContext
.getDXFGeneratorManager().getDXFProfile(profileName);
BufferedOutputStream buffered = new BufferedOutputStream(out);
if (!this.generationContext
.hasAttribute(DXFGenerationConstants.DEFAULT_TEXT_HEIGHT)) {
this.generationContext.addAttribute(
DXFGenerationConstants.DEFAULT_TEXT_HEIGHT, "1.0");
}
DXFOutput output = null;
if (this.generationContext
.hasAttribute(DXFGenerationConstants.DXF_ENCODING)) {
output = new DXFOutput(buffered, this.generationContext
.getAttribute(DXFGenerationConstants.DXF_ENCODING)
.toString());
} else {
output = new DXFOutput(buffered,
DXFGenerationConstants.DEFAULT_ENCODING);
}
this.outputSection(Constants.SECTION_HEADER, profile, output, doc);
this.outputSection(Constants.SECTION_CLASSES, profile, output, doc);
this.outputSection(Constants.SECTION_TABLES, profile, output, doc);
this.outputSection(Constants.SECTION_BLOCKS, profile, output, doc);
this.outputSection(Constants.SECTION_ENTITIES, profile, output, doc);
this.outputSection(Constants.SECTION_OBJECTS, profile, output, doc);
this.outputSection(Constants.SECTION_THUMBNAILIMAGE, profile,
output, doc);
output.output(0, "EOF");
try {
buffered.flush();
buffered.close();
} catch (IOException e) {
throw new GenerationException("Could not close stream.", e);
}
} else {
throw new GenerationException(
"No DXF-Profile defined or not found, you have to configure a DXF-Profile.");
}
}
/*
* (non-Javadoc)
*
* @see org.kabeja.io.Generator#getMimeType()
*/
public String getMimeType() {
return MIME_TYPE;
}
/*
* (non-Javadoc)
*
* @see org.kabeja.io.Generator#getSuffix()
*/
public String getSuffix() {
return DXF_SUFFIX;
}
/*
* (non-Javadoc)
*
* @see org.kabeja.io.Generator#setProperties(java.util.Map)
*/
public void setProperties(Map<String, String> properties) {
for (Map.Entry<String, String> entry : properties.entrySet()) {
this.generationContext.addAttribute(entry.getKey(), entry
.getValue());
}
}
protected void outputSection(String section, DXFProfile profile,
DXFOutput output, DraftDocument doc) throws GenerationException {
if (this.generationContext.getDXFGeneratorManager()
.hasDXFSectionGenerator(section)
&& profile.hasDXFType(section)) {
DXFSectionGenerator generator = this.generationContext
.getDXFGeneratorManager().getDXFSectionGenerator(section);
output.output(0, Constants.SECTION_START);
output.output(2, section);
generator.generate(output, doc, generationContext, profile);
output.output(0, Constants.SECTION_END);
}
}
}