blob: b0aa7d5f589fca55c6bab5d8b3eb15623f5dbc5c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
/* $Id$ */
package org.apache.fop.render.mif;
// Java
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
/**
* The is the basis for MIF document elements.
* This enables the creation of the element and to write it
* to an output stream including sub-elements or a single value.
*/
public class MIFElement {
/** name */
protected String name;
/** value string */
protected String valueStr = null;
/** value elements */
protected List valueElements = null;
/** true if started */
protected boolean started = false;
/** true if finishing */
protected boolean finish = false;
/** true if finished */
protected boolean finished = false;
/**
* @param name a name
*/
public MIFElement(String name) {
this.name = name;
}
/** @param str a string value */
public void setValue(String str) {
valueStr = str;
}
/** @param el an MIF element */
public void addElement(MIFElement el) {
if (valueElements == null) {
valueElements = new java.util.ArrayList();
}
valueElements.add(el);
}
/**
* Output this element to an output stream.
* This will output only so far as the fisrt unfinished child element.
* This method can be called again to continue from the previous point.
* An element that contains child elements will only be finished when
* the finish method is called.
* @param os output stream
* @param indent indentation
* @return true if finished
* @throws IOException if not caught
*/
public boolean output(OutputStream os, int indent) throws IOException {
if (finished) {
return true;
}
if (valueElements == null && valueStr == null) {
return false;
}
String indentStr = "";
for (int c = 0; c < indent; c++) {
indentStr += " ";
}
if (!started) {
os.write((indentStr + "<" + name).getBytes());
if (valueElements != null) {
os.write(("\n").getBytes());
}
started = true;
}
if (valueElements != null) {
boolean done = true;
for (Iterator iter = valueElements.iterator(); iter.hasNext();) {
MIFElement el = (MIFElement)iter.next();
boolean d = el.output(os, indent + 1);
if (d) {
iter.remove();
} else {
done = false;
break;
}
}
if (!finish || !done) {
return false;
}
os.write((indentStr + "> # end of " + name + "\n").getBytes());
} else {
os.write((" " + valueStr + ">\n").getBytes());
}
finished = true;
return true;
}
/** @param deep if true, also perform finish over value elements */
public void finish(boolean deep) {
finish = true;
if (deep && valueElements != null) {
for (Iterator iter = valueElements.iterator(); iter.hasNext();) {
MIFElement el = (MIFElement)iter.next();
el.finish(deep);
}
}
}
}