/*
Copyright 2013 BarD Software s.r.o
This file is part of GanttProject, an opensource project management tool.
GanttProject is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
GanttProject is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GanttProject. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sourceforge.ganttproject.parser;
import org.xml.sax.Attributes;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
/**
* Base class for all tag handlers.
*
* @author dbarashev (Dmitry Barashev)
*/
public abstract class AbstractTagHandler implements TagHandler {
private final String myTagName;
private final StringBuilder myCdataBuffer;
private boolean myTagStarted;
protected AbstractTagHandler(String tagName, boolean hasCdata) {
myTagName = tagName;
myCdataBuffer = hasCdata ? new StringBuilder() : null;
}
protected AbstractTagHandler(String tagName) {
this(tagName, false);
}
@Override
public boolean hasCdata() {
return myCdataBuffer != null;
}
@Override
public void appendCdata(String cdata) {
assert hasCdata() : "It is a bug: this method should not be called for a tag which has no cdata";
if (myTagStarted) {
myCdataBuffer.append(cdata);
}
}
protected void setTagStarted(boolean started) {
myTagStarted = started;
if (!started && hasCdata()) {
// we clear accumulated CDATA value when tag which contains CDATA closes
clearCdata();
}
}
protected boolean isMyTag(String tagName) {
Preconditions.checkNotNull(myTagName);
return myTagName.equals(tagName);
}
protected boolean isTagStarted() {
return myTagStarted;
}
protected String getCdata() {
return myCdataBuffer.toString();
}
protected void clearCdata() {
myCdataBuffer.setLength(0);
}
@Override
public void startElement(String namespaceURI, String sName, String qName, Attributes attrs)
throws FileFormatException {
Preconditions.checkNotNull(myTagName, "If you don't define tag name then please override this method");
if (Objects.equal(myTagName, qName)) {
myTagStarted = onStartElement(attrs);
}
}
protected boolean onStartElement(Attributes attrs) {
return true;
}
@Override
public void endElement(String namespaceURI, String sName, String qName) {
if (myTagStarted && Objects.equal(myTagName, qName)) {
myTagStarted = false;
onEndElement();
}
}
protected void onEndElement() {
}
}