blob: e0ee5b3b3df691163882580fdcdfeebeef90c8d2 [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.intermediate;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.io.IOUtils;
import org.apache.fop.fonts.FontCollection;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.fonts.FontManager;
import org.apache.fop.fonts.base14.Base14FontCollection;
/**
* Abstract base class for binary-writing {@link IFDocumentHandler} implementations.
*/
public abstract class AbstractBinaryWritingIFDocumentHandler extends AbstractIFDocumentHandler {
/** The output stream to write the document to */
protected OutputStream outputStream;
private boolean ownOutputStream;
/** Font configuration */
protected FontInfo fontInfo;
public AbstractBinaryWritingIFDocumentHandler(IFContext ifContext) {
super(ifContext);
}
/** {@inheritDoc} */
public void setResult(Result result) throws IFException {
if (result instanceof StreamResult) {
StreamResult streamResult = (StreamResult) result;
OutputStream out = streamResult.getOutputStream();
if (out == null) {
if (streamResult.getWriter() != null) {
throw new IllegalArgumentException(
"FOP cannot use a Writer. Please supply an OutputStream!");
}
try {
URI resultURI = URI.create(streamResult.getSystemId());
out = new BufferedOutputStream(getUserAgent().getResourceResolver().getOutputStream(resultURI));
} catch (IOException ioe) {
throw new IFException("I/O error while opening output stream" , ioe);
}
this.ownOutputStream = true;
}
this.outputStream = out;
} else {
throw new UnsupportedOperationException(
"Unsupported Result subclass: " + result.getClass().getName());
}
}
/** {@inheritDoc} */
public FontInfo getFontInfo() {
return this.fontInfo;
}
/** {@inheritDoc} */
public void setFontInfo(FontInfo fontInfo) {
this.fontInfo = fontInfo;
}
/** {@inheritDoc} */
public void setDefaultFontInfo(FontInfo fontInfo) {
FontManager fontManager = getUserAgent().getFontManager();
FontCollection[] fontCollections = new FontCollection[] {
new Base14FontCollection(fontManager.isBase14KerningEnabled())
};
FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo());
fi.setEventListener(new FontEventAdapter(getUserAgent().getEventBroadcaster()));
fontManager.setup(fi, fontCollections);
setFontInfo(fi);
}
/** {@inheritDoc} */
public void startDocument() throws IFException {
super.startDocument();
if (this.outputStream == null) {
throw new IllegalStateException("OutputStream hasn't been set through setResult()");
}
}
/** {@inheritDoc} */
public void endDocument() throws IFException {
if (this.ownOutputStream) {
IOUtils.closeQuietly(this.outputStream);
this.outputStream = null;
}
}
}