/* * 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.accessibility; import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * A reduced version of the document's FO tree, containing only its logical * structure. Used by accessible output formats. */ public final class StructureTree { private final List pageSequenceStructures = new ArrayList(); /** * Package-private default constructor. */ StructureTree() { } private static boolean flowOrStaticContentNodes(NodeList nodes) { for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); if (node.getNodeType() != Node.ELEMENT_NODE) { return false; } String name = node.getLocalName(); if (!(name.equals("flow") || name.equals("static-content"))) { return false; } } return true; } void addPageSequenceStructure(NodeList structureTree) { assert flowOrStaticContentNodes(structureTree); pageSequenceStructures.add(structureTree); } /** * Returns the list of nodes that are the children of the given page sequence. * * @param index index of the page sequence, 0-based * @return its children nodes */ public NodeList getPageSequence(int index) { return (NodeList) pageSequenceStructures.get(index); } /** * Returns an XML-like representation of the structure trees. *
* Note: use only for debugging purpose, as this method * performs non-trivial operations. *
* @return a string representation of this object */ public String toString() { try { Transformer t = TransformerFactory.newInstance().newTransformer(); Writer str = new StringWriter(); for (Iterator iter = pageSequenceStructures.iterator(); iter.hasNext();) { NodeList nodes = (NodeList) iter.next(); for (int i = 0, c = nodes.getLength(); i < c; i++) { t.transform(new DOMSource(nodes.item(i)), new StreamResult(str)); } } return str.toString(); } catch (Exception e) { return e.toString(); } } }