/*******************************************************************************
* 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.parser;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import org.kabeja.DraftDocument;
import org.kabeja.dxf.parser.entities.DXFEntityHandler;
import org.kabeja.entities.Entity;
import org.kabeja.parser.ParseException;
/**
* @author <a href="mailto:simon.mieth@gmx.de>Simon Mieth</a>
*
*
*/
public class DXFEntitiesSectionHandler extends AbstractSectionHandler
implements DXFSectionHandler, DXFHandlerManager {
private static String SECTION_KEY = "ENTITIES";
public static final int ENTITY_START = 0;
protected Map<String,DXFHandler> handlers = new TreeMap<String,DXFHandler>();
protected DXFEntityHandler handler = null;
protected boolean parseEntity = false;
public DXFEntitiesSectionHandler() {
}
/*
* (non-Javadoc)
*
* @see org.dxf2svg.parser.SectionHandler#getSectionKey()
*/
public String getSectionKey() {
return SECTION_KEY;
}
/*
* (non-Javadoc)
*
* @see org.dxf2svg.parser.SectionHandler#parseGroup(int, java.lang.String)
*/
public void parseGroup(int groupCode, DXFValue value) throws ParseException {
if (groupCode == ENTITY_START) {
if (parseEntity) {
if (handler.isFollowSequence()) {
//there is a sequence like polyline
handler.parseGroup(groupCode, value);
return;
} else {
endEntity();
//check for reuse
if(handler.getDXFEntityType().equals(value.getValue())){
handler.startDXFEntity();
parseEntity = true;
return;
}
}
}
if (handlers.containsKey(value.getValue())) {
//get handler for the new entity
handler = (DXFEntityHandler) handlers.get(value.getValue());
handler.setDocument(this.doc);
handler.startDXFEntity();
parseEntity = true;
} else {
//no handler found
parseEntity = false;
}
} else if (parseEntity) {
//handler.setDXFDocument(this.doc);
handler.parseGroup(groupCode, value);
}
}
/*
* (non-Javadoc)
*
* @see org.dxf2svg.parser.SectionHandler#setDXFDocument(org.dxf2svg.xml.DXFDocument)
*/
public void setDocument(DraftDocument doc) {
this.doc = doc;
}
/*
* (non-Javadoc)
*
* @see org.dxf2svg.parser.SectionHandler#endParsing()
*/
public void endSection() {
endEntity();
}
/*
* (non-Javadoc)
*
* @see org.dxf2svg.parser.SectionHandler#startParsing()
*/
public void startSection() {
parseEntity = false;
}
protected void endEntity() {
if (parseEntity) {
handler.endDXFEntity();
Entity entity = handler.getDXFEntity();
doc.addEntity(entity);
}
}
public void addDXFEntityHandler(DXFEntityHandler handler) {
handler.setDocument(doc);
handlers.put(handler.getDXFEntityType(), handler);
}
public void addHandler(DXFHandler handler) {
addDXFEntityHandler((DXFEntityHandler) handler);
}
/* (non-Javadoc)
* @see de.miethxml.kabeja.parser.Handler#releaseDXFDocument()
*/
public void releaseDocument() {
this.doc = null;
Iterator i = handlers.values().iterator();
while (i.hasNext()) {
DXFHandler handler = (DXFHandler) i.next();
handler.releaseDocument();
}
}
}