blob: b59cdfe1a509a8f8e7cebd3508857f78a9860488 [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.
*
*************************************************************/
package com.sun.star.report.pentaho.output;
import com.sun.star.report.pentaho.OfficeNamespaces;
import com.sun.star.report.pentaho.model.DataStyle;
import com.sun.star.report.pentaho.model.FontFaceDeclsSection;
import com.sun.star.report.pentaho.model.FontFaceElement;
import com.sun.star.report.pentaho.model.OfficeMasterPage;
import com.sun.star.report.pentaho.model.OfficeMasterStyles;
import com.sun.star.report.pentaho.model.OfficeStyle;
import com.sun.star.report.pentaho.model.OfficeStyles;
import com.sun.star.report.pentaho.model.OfficeStylesCollection;
import com.sun.star.report.pentaho.model.PageLayout;
import com.sun.star.report.pentaho.model.RawText;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import org.jfree.layouting.namespace.Namespaces;
import org.jfree.layouting.util.AttributeMap;
import org.jfree.report.JFreeReportBoot;
import org.jfree.report.JFreeReportInfo;
import org.jfree.report.ReportProcessingException;
import org.jfree.report.structure.Element;
import org.jfree.report.structure.Node;
import org.jfree.report.structure.Section;
import org.jfree.report.structure.StaticText;
import org.pentaho.reporting.libraries.xmlns.common.AttributeList;
import org.pentaho.reporting.libraries.xmlns.writer.DefaultTagDescription;
import org.pentaho.reporting.libraries.xmlns.writer.XmlWriter;
import org.pentaho.reporting.libraries.xmlns.writer.XmlWriterSupport;
/**
* This class writes the style collection into a 'styles.xml' document.
*
* @author Thomas Morgner
* @since 09.03.2007
*/
public class StylesWriter
{
private final XmlWriter xmlWriter;
private final boolean writeOpeningTag;
public StylesWriter(final Writer writer)
{
final DefaultTagDescription tagDescription = new DefaultTagDescription();
tagDescription.configure(JFreeReportBoot.getInstance().getGlobalConfig(),
OfficeDocumentReportTarget.TAG_DEF_PREFIX);
this.xmlWriter = new XmlWriter(writer, tagDescription);
this.xmlWriter.setAlwaysAddNamespace(true);
this.writeOpeningTag = true;
}
public StylesWriter(final XmlWriter xmlWriter)
{
this.xmlWriter = xmlWriter;
this.writeOpeningTag = false;
}
public void writeContentStyles(final OfficeStylesCollection predefined,
final OfficeStylesCollection globals)
throws IOException, ReportProcessingException
{
writeFontFaces(new OfficeStylesCollection[]
{
globals
});
writeAutomaticStylesSection(new OfficeStylesCollection[]
{
globals
});
}
public void writeGlobalStyles(final OfficeStylesCollection predefined,
final OfficeStylesCollection globals)
throws IOException, ReportProcessingException
{
if (writeOpeningTag)
{
performWriteRootTag();
}
writeFontFaces(new OfficeStylesCollection[]
{
globals
});
writeCommonStylesSection(new OfficeStylesCollection[]
{
globals
});
writeAutomaticStylesSection(new OfficeStylesCollection[]
{
globals
});
writeMasterStylesSection(new OfficeStylesCollection[]
{
globals
});
if (writeOpeningTag)
{
xmlWriter.writeCloseTag();
}
}
private void writeMasterStylesSection(final OfficeStylesCollection[] osc)
throws IOException
{
xmlWriter.writeTag(OfficeNamespaces.OFFICE_NS, "master-styles", XmlWriterSupport.OPEN);
for (int sci = 0; sci < osc.length; sci++)
{
final OfficeStylesCollection collection = osc[sci];
final OfficeMasterStyles officeStyles = collection.getMasterStyles();
final OfficeMasterPage[] officeMasterPages = officeStyles.getAllMasterPages();
for (int i = 0; i < officeMasterPages.length; i++)
{
final OfficeMasterPage masterPage = officeMasterPages[i];
writeSection(masterPage);
}
writeSectionChilds(officeStyles.getOtherNodes().getNodeArray());
}
xmlWriter.writeCloseTag();
}
private void writeCommonStylesSection(final OfficeStylesCollection[] osc)
throws IOException
{
xmlWriter.writeTag(OfficeNamespaces.OFFICE_NS, "styles", XmlWriterSupport.OPEN);
for (int sci = 0; sci < osc.length; sci++)
{
final OfficeStylesCollection collection = osc[sci];
final OfficeStyles officeStyles = collection.getCommonStyles();
writeStyles(officeStyles);
}
xmlWriter.writeCloseTag();
}
private void writeAutomaticStylesSection(final OfficeStylesCollection[] osc)
throws IOException
{
xmlWriter.writeTag(OfficeNamespaces.OFFICE_NS, "automatic-styles", XmlWriterSupport.OPEN);
for (int sci = 0; sci < osc.length; sci++)
{
final OfficeStylesCollection collection = osc[sci];
final OfficeStyles officeStyles = collection.getAutomaticStyles();
writeStyles(officeStyles);
}
xmlWriter.writeCloseTag();
}
private void writeFontFaces(final OfficeStylesCollection[] osc)
throws IOException
{
xmlWriter.writeTag(OfficeNamespaces.OFFICE_NS, "font-face-decls", XmlWriterSupport.OPEN);
final TreeMap fontFaces = new TreeMap();
for (int sci = 0; sci < osc.length; sci++)
{
final OfficeStylesCollection collection = osc[sci];
final FontFaceDeclsSection fontFaceDecls = collection.getFontFaceDecls();
final FontFaceElement[] fontFaceElements = fontFaceDecls.getAllFontFaces();
for (int i = 0; i < fontFaceElements.length; i++)
{
final FontFaceElement element = fontFaceElements[i];
fontFaces.put(element.getStyleName(), element);
}
}
final Iterator values = fontFaces.values().iterator();
while (values.hasNext())
{
final FontFaceElement element = (FontFaceElement) values.next();
writeElement(element);
}
xmlWriter.writeCloseTag();
}
private void writeStyles(final OfficeStyles styles)
throws IOException
{
final OfficeStyle[] allStyles = styles.getAllStyles();
for (int i = 0; i < allStyles.length; i++)
{
final OfficeStyle style = allStyles[i];
writeSection(style);
}
final DataStyle[] allDataStyles = styles.getAllDataStyles();
for (int i = 0; i < allDataStyles.length; i++)
{
final DataStyle style = allDataStyles[i];
writeSection(style);
}
final PageLayout[] allPageStyles = styles.getAllPageStyles();
for (int i = 0; i < allPageStyles.length; i++)
{
final PageLayout style = allPageStyles[i];
writeSection(style);
}
writeSectionChilds(styles.getOtherStyles());
}
private void writeElement(final Element element)
throws IOException
{
final String type = element.getType();
final String namespace = element.getNamespace();
final AttributeList attrList = buildAttributeList(element.getAttributeMap());
xmlWriter.writeTag(namespace, type, attrList, XmlWriterSupport.CLOSE);
}
private void writeSection(final Section section)
throws IOException
{
final String type = section.getType();
final String namespace = section.getNamespace();
final AttributeList attrList = buildAttributeList(section.getAttributeMap());
if (section.getNodeCount() == 0)
{
xmlWriter.writeTag(namespace, type, attrList, XmlWriterSupport.CLOSE);
return;
}
xmlWriter.writeTag(namespace, type, attrList, XmlWriterSupport.OPEN);
writeSectionChilds(section.getNodeArray());
xmlWriter.writeCloseTag();
}
private void writeSectionChilds(final Node[] nodes)
throws IOException
{
for (int i = 0; i < nodes.length; i++)
{
final Node node = nodes[i];
if (node instanceof Section)
{
writeSection((Section) node);
}
else if (node instanceof Element)
{
writeElement((Element) node);
}
else if (node instanceof RawText)
{
final RawText text = (RawText) node;
xmlWriter.writeText(text.getText());
}
else if (node instanceof StaticText)
{
final StaticText text = (StaticText) node;
xmlWriter.writeTextNormalized(text.getText(), false);
}
}
}
protected AttributeList buildAttributeList(final AttributeMap attrs)
{
final AttributeList attrList = new AttributeList();
final String[] namespaces = attrs.getNameSpaces();
for (int i = 0; i < namespaces.length; i++)
{
final String attrNamespace = namespaces[i];
if (isFilteredNamespace(attrNamespace))
{
continue;
}
final Map localAttributes = attrs.getAttributes(attrNamespace);
final Iterator entries = localAttributes.entrySet().iterator();
while (entries.hasNext())
{
final Map.Entry entry = (Map.Entry) entries.next();
final String key = String.valueOf(entry.getKey());
attrList.setAttribute(attrNamespace, key, String.valueOf(entry.getValue()));
}
}
return attrList;
}
protected boolean isFilteredNamespace(final String namespace)
{
if (Namespaces.LIBLAYOUT_NAMESPACE.equals(namespace))
{
return true;
}
if (JFreeReportInfo.REPORT_NAMESPACE.equals(namespace))
{
return true;
}
if (JFreeReportInfo.COMPATIBILITY_NAMESPACE.equals(namespace))
{
return true;
}
if (OfficeNamespaces.OOREPORT_NS.equals(namespace))
{
return true;
}
return false;
}
private void performWriteRootTag()
throws IOException
{
final AttributeList rootAttributes = new AttributeList();
rootAttributes.addNamespaceDeclaration("office",
OfficeNamespaces.OFFICE_NS);
rootAttributes.addNamespaceDeclaration("style", OfficeNamespaces.STYLE_NS);
rootAttributes.addNamespaceDeclaration("text", OfficeNamespaces.TEXT_NS);
rootAttributes.addNamespaceDeclaration("table", OfficeNamespaces.TABLE_NS);
rootAttributes.addNamespaceDeclaration("draw", OfficeNamespaces.DRAWING_NS);
rootAttributes.addNamespaceDeclaration("fo", OfficeNamespaces.FO_NS);
rootAttributes.addNamespaceDeclaration("xlink", OfficeNamespaces.XLINK_NS);
rootAttributes.addNamespaceDeclaration("dc", OfficeNamespaces.PURL_NS);
rootAttributes.addNamespaceDeclaration("meta", OfficeNamespaces.META_NS);
rootAttributes.addNamespaceDeclaration("number",
OfficeNamespaces.DATASTYLE_NS);
rootAttributes.addNamespaceDeclaration("svg", OfficeNamespaces.SVG_NS);
rootAttributes.addNamespaceDeclaration("chart", OfficeNamespaces.CHART_NS);
rootAttributes.addNamespaceDeclaration("chartooo", OfficeNamespaces.CHARTOOO_NS);
rootAttributes.addNamespaceDeclaration("dr3d", OfficeNamespaces.DR3D_NS);
rootAttributes.addNamespaceDeclaration("math", OfficeNamespaces.MATHML_NS);
rootAttributes.addNamespaceDeclaration("form", OfficeNamespaces.FORM_NS);
rootAttributes.addNamespaceDeclaration("script",
OfficeNamespaces.SCRIPT_NS);
rootAttributes.addNamespaceDeclaration("ooo", OfficeNamespaces.OO2004_NS);
rootAttributes.addNamespaceDeclaration("ooow", OfficeNamespaces.OOW2004_NS);
rootAttributes.addNamespaceDeclaration("oooc", OfficeNamespaces.OOC2004_NS);
rootAttributes.addNamespaceDeclaration("dom",
OfficeNamespaces.XML_EVENT_NS);
rootAttributes.addNamespaceDeclaration("xforms",
OfficeNamespaces.XFORMS_NS);
rootAttributes.addNamespaceDeclaration("xsd", OfficeNamespaces.XSD_NS);
rootAttributes.addNamespaceDeclaration("xsi", OfficeNamespaces.XSI_NS);
rootAttributes.addNamespaceDeclaration("grddl", OfficeNamespaces.GRDDL_NS);
rootAttributes.setAttribute(OfficeNamespaces.OFFICE_NS, "version",
OfficeDocumentReportTarget.ODF_VERSION);
this.xmlWriter.writeXmlDeclaration("UTF-8");
this.xmlWriter.writeTag(OfficeNamespaces.OFFICE_NS,
"document-styles", rootAttributes, XmlWriterSupport.OPEN);
}
public void close()
throws IOException
{
xmlWriter.close();
}
}