Browse Source

Seshadri G.K.: memory buffering


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@194257 13f79535-47bb-0310-9956-ffa450edef68
pull/33/head
arved 23 years ago
parent
commit
a7de5c5cad

+ 26
- 0
src/org/apache/fop/apps/CommandLineOptions.java View File

@@ -42,6 +42,9 @@ public class CommandLineOptions {
/* output: text file */
private static final int TXT_OUTPUT = 6;

/* System buffers */
private static final int BUFFER_FILE = 7;
/* use debug mode*/
Boolean errorDump = new Boolean(false);
/* show configuration information */
@@ -58,10 +61,14 @@ public class CommandLineOptions {
File xmlfile = null;
/* name of output file */
File outfile = null;
/* name of buffer file */
File bufferFile = null;
/* input mode */
int inputmode = NOT_SET;
/*output mode */
int outputmode = NOT_SET;
/* buffer mode */
int buffermode = NOT_SET;
/* language for user information */
String language = null;

@@ -206,6 +213,21 @@ public class CommandLineOptions {
} else {
throw new FOPException("Don't know what to do with " + args[i]);
}
} else if (args[i].equals("-buf")) {
if (buffermode == NOT_SET) {
buffermode = BUFFER_FILE;
} else {
MessageHandler.errorln("ERROR: you can only set one buffer method");
printUsage();
}
if ((i + 1 == args.length) ||
(args[i + 1].charAt(0) == '-')) {
MessageHandler.errorln("ERROR: you must specify the buffer output file");
printUsage();
} else {
bufferFile = new File (args[i + 1]);
i++;
}
} else {
printUsage();
return false;
@@ -392,6 +414,10 @@ public class CommandLineOptions {
return language;
}

public File getBufferFile() {
return bufferFile;
}
public Boolean isQuiet() {
return quiet;
}

+ 3
- 1
src/org/apache/fop/apps/CommandLineStarter.java View File

@@ -45,8 +45,10 @@ public class CommandLineStarter extends Starter {

XMLReader parser = inputHandler.getParser();
setParserFeatures(parser);
Driver driver = new Driver();
driver.setBufferFile(commandLineOptions.getBufferFile());

Driver driver = new Driver();
if (errorDump) {
driver.setErrorDump(true);
}

+ 14
- 2
src/org/apache/fop/apps/Driver.java View File

@@ -1,4 +1,4 @@
/*
/* $Id$
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources."
@@ -20,6 +20,7 @@ import org.apache.fop.configuration.Configuration;
import org.apache.fop.tools.DocumentInputSource;
import org.apache.fop.tools.DocumentReader;

import org.apache.fop.system.BufferManager;

// DOM
import org.w3c.dom.Document;
@@ -130,10 +131,15 @@ public class Driver {
/** If true, full error stacks are reported */
private boolean _errorDump = false;

/** the system resources that FOP will use */
private BufferManager _bufferManager;

/** create a new Driver */
public Driver() {
_stream = null;
_treeBuilder = new FOTreeBuilder();
_bufferManager = new BufferManager();
_treeBuilder = new FOTreeBuilder();
_treeBuilder.setBufferManager(_bufferManager);
setupDefaultMappings();
}

@@ -451,6 +457,12 @@ public class Driver {
}
}

/* Set up the system buffers */
public void setBufferFile(File bufferFile) {
this._bufferManager.addBufferFile(bufferFile);
}
/**
* format the formatting object tree into an area tree
*/

+ 24
- 48
src/org/apache/fop/fo/FONode.java View File

@@ -1,60 +1,17 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "FOP" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources."
*/


package org.apache.fop.fo;

// FOP
import org.apache.fop.apps.FOPException;
import org.apache.fop.layout.Area;
import org.apache.fop.layout.LinkSet;
import org.apache.fop.system.BufferManager;

// Java
import java.util.Vector;
@@ -66,6 +23,8 @@ abstract public class FONode {

protected FObj parent;

public BufferManager bufferManager;
public Vector children = new Vector(); // made public for searching for id's

/** value of marker before layout begins */
@@ -93,6 +52,9 @@ abstract public class FONode {

protected FONode(FObj parent) {
this.parent = parent;
if (parent != null) {
this.bufferManager = parent.bufferManager;
}
}

public void setIsInTableCell() {
@@ -152,6 +114,14 @@ abstract public class FONode {
return this.parent;
}

public void setBufferManager(BufferManager bufferManager) {
this.bufferManager = bufferManager;
}
public BufferManager getBufferManager() {
return this.bufferManager;
}
public void setLinkSet(LinkSet linkSet) {
this.linkSet = linkSet;
for (int i = 0; i < this.children.size(); i++) {
@@ -220,6 +190,12 @@ abstract public class FONode {
return;
int numChildren = this.children.size();
if (this.marker <= START)
{
return;
}
for (int i = this.marker + 1; i < numChildren; i++) {
FONode fo = (FONode) children.elementAt(i);
fo.resetMarker();

+ 20
- 53
src/org/apache/fop/fo/FOText.java View File

@@ -1,52 +1,7 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.

4. The names "FOP" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

/* $Id$
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources."
*/

package org.apache.fop.fo;
@@ -60,13 +15,14 @@ import org.apache.fop.layout.*;
import org.apache.fop.datatypes.*;
import org.apache.fop.fo.properties.*;
import org.apache.fop.apps.FOPException;
import org.apache.fop.system.BufferManager;

/**
* a text node in the formatting object tree
*/
public class FOText extends FONode {

protected char[] ca;
// protected char[] ca;
protected int start;
protected int length;

@@ -89,10 +45,18 @@ public class FOText extends FONode {
public FOText(char[] chars, int s, int e, FObj parent) {
super(parent);
this.start = 0;
this.ca = new char[e - s];
char ca[] = new char[e - s];
for (int i = s; i < e; i++)
this.ca[i - s] = chars[i];
ca[i - s] = chars[i];
this.length = e - s;
this.bufferManager = parent.bufferManager;
if (this.bufferManager != null) {
bufferManager.writeBuffer((Object) this, ca);
}
else {
System.out.println("abnormal exit");
System.exit(0);
}
}

public void setUnderlined(boolean ul) {
@@ -110,11 +74,13 @@ public class FOText extends FONode {

public boolean willCreateArea()
{
char ca[] = this.bufferManager.readBuffer((Object) this);
this.whiteSpaceCollapse = this.parent.properties.get(
"white-space-collapse").getEnum();
if(this.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE && length > 0) {
return true;
}
for (int i = start; i < start + length; i++) {
char ch = ca[i];
if (!((ch == ' ') || (ch == '\n') || (ch == '\r') ||
@@ -126,6 +92,7 @@ public class FOText extends FONode {
}

public Status layout(Area area) throws FOPException {
char ca[] = this.bufferManager.readBuffer((Object) this);
if (!(area instanceof BlockArea)) {
MessageHandler.errorln("WARNING: text outside block area" +
new String(ca, start, length));
@@ -152,7 +119,7 @@ public class FOText extends FONode {
this.red = c.red();
this.green = c.green();
this.blue = c.blue();
this.verticalAlign = this.parent.properties.get("vertical-align").getEnum();

this.wrapOption =

+ 11
- 2
src/org/apache/fop/fo/FOTreeBuilder.java View File

@@ -55,6 +55,8 @@ import org.apache.fop.layout.AreaTree;
import org.apache.fop.messaging.MessageHandler;
import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.pagination.Root;
import org.apache.fop.system.BufferManager;


// SAX
import org.xml.sax.helpers.DefaultHandler;
@@ -93,7 +95,9 @@ public class FOTreeBuilder extends DefaultHandler implements TreeBuilder {
*/
protected FObj rootFObj = null;

/**
public BufferManager bufferManager;
/**
* set of names of formatting objects encountered but unknown
*/
protected Hashtable unknownFOs = new Hashtable();
@@ -277,6 +281,7 @@ public class FOTreeBuilder extends DefaultHandler implements TreeBuilder {

if (rootFObj == null) {
rootFObj = fobj;
rootFObj.setBufferManager(this.bufferManager);
if (!fobj.getName().equals("fo:root")) {
throw new SAXException(
new FOPException("Root element must" +
@@ -296,6 +301,7 @@ public class FOTreeBuilder extends DefaultHandler implements TreeBuilder {
*/
public void format(AreaTree areaTree) throws FOPException {
MessageHandler.logln("formatting FOs into areas");
this.bufferManager.readComplete();
((Root) this.rootFObj).format(areaTree);
}

@@ -309,5 +315,8 @@ public class FOTreeBuilder extends DefaultHandler implements TreeBuilder {
{
return (rootFObj != null);
}

public void setBufferManager(BufferManager bufferManager) {
this.bufferManager = bufferManager;
}
}

+ 29
- 0
src/org/apache/fop/system/BufferArray.java View File

@@ -0,0 +1,29 @@
/* $Id$
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources."
*/

// Seshadri
/* This package is to be used for all Oeprating System related activities. */
/* This buffers data into an array in memory */

package org.apache.fop.system;


// FOP



// Java


public class BufferArray {
public BufferArray() {
}
}

+ 26
- 0
src/org/apache/fop/system/BufferFile.java View File

@@ -0,0 +1,26 @@
/* $Id$
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources."
*/

// Seshadri
/* This package is to be used for all Oeprating System related activities. */
/* This buffers data into a file */



package org.apache.fop.system;


import java.io.*;



public class BufferFile {
public BufferFile () {
}
}

+ 190
- 0
src/org/apache/fop/system/BufferManager.java View File

@@ -0,0 +1,190 @@
/* $Id$
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources."
*/

// Seshadri
/* This package is to be used for all Oeprating System related activities.
This file manages system buffers */

package org.apache.fop.system;


// FOP

import org.apache.fop.fo.FONode;


// Java

import java.io.*;
import java.util.Hashtable;


public class BufferManager {
protected FileWriter fw;
protected FileReader fr;
protected char cache[]; // Cache
protected long csize; //Cache size
protected File buff=null;
protected long fp = 0;
protected long markStart=0; // used to set the current point in the stream while reading
protected long markEnd=0;
protected long curMark=0;
// Hash of objects and their offsets within
Hashtable offSetTable = new Hashtable();
private class Offset {
long fp=0; // File Pointer
int length;
char[] data; // when no buffer is specified
Offset(long fp,int length,char data[]) {
this.fp = fp;
this.length = length;
this.data = data;
}
}
public void addBufferFile(File buff) {
if (buff != null)
try {
fw = new FileWriter(buff);
fr = new FileReader(buff);
csize = 100000;
this.buff = buff;
}
catch (Exception e) {
System.out.println(e);
}
}
public void writeBuffer(Object obj,char arr[]) {
int length = arr.length;
if (buff != null) {
offSetTable.put(obj, new Offset(this.fp,length,null));
try {
fw.write(arr);
this.fp += length;
}
catch (Exception e) {
System.out.println(e);
}
}
else {
// Store the data in memory
offSetTable.put(obj, new Offset(this.fp,length,arr));
}
}
public void readComplete() {
// An indication that manager can close the writable buffers and prepare
// for reading..
if (buff != null)
try {
fw.close();
cache = new char[(int) csize];
setupCache(curMark);
}
catch (Exception e) {
System.out.println(e);
}
}

public char[] readBuffer(Object obj) {
Offset values = (Offset) offSetTable.get(obj);
// Was buffering used?
if (buff != null) {
char ca[] = new char[values.length];
// Check if csize is too small
if (csize < values.length) {
System.out.println("Cache size too small");
System.exit(0);
}
// Is the data outside the cache?
if (! (values.fp >= markStart && values.fp + values.length <= markEnd)) {
setupCache(values.fp);
}
for (long i = values.fp - markStart,j=0; j < values.length; ++i,++j) {
ca[(int)j] = cache[(int)i];
}
return ca;
}
else {
return values.data;
}
}
protected void setupCache(long curMark) {
try {
FileReader fr = new FileReader(buff);
fr.skip(curMark);
long rem = buff.length() - curMark;
if (rem > csize) {
rem = csize;
}
fr.read(cache,0,(int)rem);
markStart = curMark;
markEnd = rem - 1;
}
catch (Exception e) {
System.out.println(e);
}
}
}

Loading…
Cancel
Save