You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by je...@apache.org on 2008/12/17 16:05:46 UTC
svn commit: r727407 - in /xmlgraphics/commons/trunk:
src/java/org/apache/xmlgraphics/ps/ src/java/org/apache/xmlgraphics/ps/dsc/
src/java/org/apache/xmlgraphics/ps/dsc/events/
src/java/org/apache/xmlgraphics/ps/dsc/tools/
test/java/org/apache/xmlgraphi...
Author: jeremias
Date: Wed Dec 17 07:05:45 2008
New Revision: 727407
URL: http://svn.apache.org/viewvc?rev=727407&view=rev
Log:
Made DefaultNestedDocumentHandler capable of operating without a PSGenerator to delegate to.
Added some new DSC comment implementations.
Generalized some features in DSCParser to use a listener pattern. Makes the whole thing more powerful.
ResourceTracker can now keep track of resource usage counts.
Comparable implementation for PSResource.
Added:
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCListener.java (with props)
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/FilteringEventListener.java (with props)
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourceDSCComment.java (with props)
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginDocument.java (with props)
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentIncludeResource.java (with props)
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentTitle.java (with props)
xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/ListenerTestCase.java (with props)
xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/test1.txt (with props)
Modified:
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSResource.java
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCCommentFactory.java
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCParser.java
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DefaultNestedDocumentHandler.java
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/NestedDocumentHandler.java
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/ResourceTracker.java
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourcesDSCComment.java
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginResource.java
xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/tools/PageExtractor.java
xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/StandardTestSuite.java
Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSResource.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSResource.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSResource.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSResource.java Wed Dec 17 07:05:45 2008
@@ -22,7 +22,7 @@
/**
* Represents a PostScript resource (file, font, procset etc.).
*/
-public class PSResource {
+public class PSResource implements Comparable {
/** a file resource */
public static final String TYPE_FILE = "file";
@@ -36,10 +36,10 @@
public static final String TYPE_FORM = "form";
/** a procset resource */
public static final String TYPE_ENCODING = "encoding";
-
+
private String type;
private String name;
-
+
/**
* Main constructor
* @param type type of the resource
@@ -49,24 +49,24 @@
this.type = type;
this.name = name;
}
-
+
/** @return the type of the resource */
public String getType() {
return this.type;
}
-
+
/** @return the name of the resource */
public String getName() {
return this.name;
}
-
+
/** @return the <resource> specification as defined in DSC v3.0 spec. */
public String getResourceSpecification() {
StringBuffer sb = new StringBuffer();
sb.append(getType()).append(" ").append(PSGenerator.convertStringToDSC(getName()));
return sb.toString();
}
-
+
/** {@inheritDoc} */
public boolean equals(Object obj) {
if (obj == this) {
@@ -85,7 +85,21 @@
}
/** {@inheritDoc} */
+ public int compareTo(Object o) {
+ PSResource other = (PSResource)o;
+ if (this == other) {
+ return 0;
+ }
+ int result = this.getType().compareTo(other.getType());
+ if (result == 0) {
+ result = this.getName().compareTo(other.getName());
+ }
+ return result;
+ }
+
+ /** {@inheritDoc} */
public String toString() {
return getResourceSpecification();
}
+
}
Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCCommentFactory.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCCommentFactory.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCCommentFactory.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCCommentFactory.java Wed Dec 17 07:05:45 2008
@@ -5,9 +5,9 @@
* 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.
@@ -23,6 +23,7 @@
import org.apache.xmlgraphics.ps.DSCConstants;
import org.apache.xmlgraphics.ps.dsc.events.DSCComment;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentBeginDocument;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentBeginResource;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentBoundingBox;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentDocumentNeededResources;
@@ -30,12 +31,14 @@
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentEndComments;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentEndOfFile;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentHiResBoundingBox;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentIncludeResource;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentLanguageLevel;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPage;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPageBoundingBox;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPageHiResBoundingBox;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPageResources;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPages;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentTitle;
/**
* Factory for DSCComment subclasses.
@@ -45,35 +48,41 @@
private static final Map DSC_FACTORIES = new java.util.HashMap();
static {
- DSC_FACTORIES.put(DSCConstants.END_COMMENTS,
+ DSC_FACTORIES.put(DSCConstants.END_COMMENTS,
DSCCommentEndComments.class);
- DSC_FACTORIES.put(DSCConstants.BEGIN_RESOURCE,
+ DSC_FACTORIES.put(DSCConstants.BEGIN_RESOURCE,
DSCCommentBeginResource.class);
- DSC_FACTORIES.put(DSCConstants.PAGE_RESOURCES,
+ DSC_FACTORIES.put(DSCConstants.INCLUDE_RESOURCE,
+ DSCCommentIncludeResource.class);
+ DSC_FACTORIES.put(DSCConstants.PAGE_RESOURCES,
DSCCommentPageResources.class);
- DSC_FACTORIES.put(DSCConstants.PAGE,
+ DSC_FACTORIES.put(DSCConstants.BEGIN_DOCUMENT,
+ DSCCommentBeginDocument.class);
+ DSC_FACTORIES.put(DSCConstants.PAGE,
DSCCommentPage.class);
- DSC_FACTORIES.put(DSCConstants.PAGES,
+ DSC_FACTORIES.put(DSCConstants.PAGES,
DSCCommentPages.class);
- DSC_FACTORIES.put(DSCConstants.BBOX,
+ DSC_FACTORIES.put(DSCConstants.BBOX,
DSCCommentBoundingBox.class);
- DSC_FACTORIES.put(DSCConstants.HIRES_BBOX,
+ DSC_FACTORIES.put(DSCConstants.HIRES_BBOX,
DSCCommentHiResBoundingBox.class);
- DSC_FACTORIES.put(DSCConstants.PAGE_BBOX,
+ DSC_FACTORIES.put(DSCConstants.PAGE_BBOX,
DSCCommentPageBoundingBox.class);
- DSC_FACTORIES.put(DSCConstants.PAGE_HIRES_BBOX,
+ DSC_FACTORIES.put(DSCConstants.PAGE_HIRES_BBOX,
DSCCommentPageHiResBoundingBox.class);
- DSC_FACTORIES.put(DSCConstants.LANGUAGE_LEVEL,
+ DSC_FACTORIES.put(DSCConstants.LANGUAGE_LEVEL,
DSCCommentLanguageLevel.class);
- DSC_FACTORIES.put(DSCConstants.DOCUMENT_NEEDED_RESOURCES,
+ DSC_FACTORIES.put(DSCConstants.DOCUMENT_NEEDED_RESOURCES,
DSCCommentDocumentNeededResources.class);
- DSC_FACTORIES.put(DSCConstants.DOCUMENT_SUPPLIED_RESOURCES,
+ DSC_FACTORIES.put(DSCConstants.DOCUMENT_SUPPLIED_RESOURCES,
DSCCommentDocumentSuppliedResources.class);
- DSC_FACTORIES.put(DSCConstants.EOF,
+ DSC_FACTORIES.put(DSCConstants.TITLE,
+ DSCCommentTitle.class);
+ DSC_FACTORIES.put(DSCConstants.EOF,
DSCCommentEndOfFile.class);
//TODO Add additional implementations as needed
}
-
+
/**
* Creates and returns new instances for DSC comments with a given name.
* @param name the name of the DSCComment (without the "%%" prefix)
@@ -88,12 +97,12 @@
try {
return (DSCComment)clazz.newInstance();
} catch (InstantiationException e) {
- throw new RuntimeException("Error instantiating instance for '" + name + "': "
+ throw new RuntimeException("Error instantiating instance for '" + name + "': "
+ e.getMessage());
} catch (IllegalAccessException e) {
- throw new RuntimeException("Illegal Access error while instantiating instance for '"
+ throw new RuntimeException("Illegal Access error while instantiating instance for '"
+ name + "': " + e.getMessage());
}
}
-
+
}
Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCListener.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCListener.java?rev=727407&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCListener.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCListener.java Wed Dec 17 07:05:45 2008
@@ -0,0 +1,44 @@
+/*
+ * 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.xmlgraphics.ps.dsc;
+
+import java.io.IOException;
+
+import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;
+
+/**
+ * Listener interface for the DSC parser. It can be used to be notified
+ */
+public interface DSCListener {
+
+ /**
+ * Called for each DSC event. You can call methods on the DSC parser to skip comments,
+ * for example. But implementations need to be good citizens and take into account that
+ * multiple listeners can be active at the same time and that they might interfere with
+ * other listeners. When returning from the call, state information such as filters should
+ * be restored.
+ * @param event the DSC event
+ * @param parser the DSC parser
+ * @throws IOException if an I/O error occurs
+ * @throws DSCException if a DSC-specific error occurs
+ */
+ void processEvent(DSCEvent event, DSCParser parser) throws IOException, DSCException;
+
+}
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCListener.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCListener.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCParser.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCParser.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCParser.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DSCParser.java Wed Dec 17 07:05:45 2008
@@ -5,9 +5,9 @@
* 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.
@@ -16,13 +16,15 @@
*/
/* $Id$ */
-
+
package org.apache.xmlgraphics.ps.dsc;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
+import java.util.Iterator;
+import java.util.List;
import java.util.NoSuchElementException;
import org.apache.xmlgraphics.ps.DSCConstants;
@@ -38,7 +40,7 @@
/**
* Parser for DSC-compliant PostScript files (DSC = Document Structuring Conventions). The parser
- * is implemented as a pull parser but has the ability to act as a push parser through the
+ * is implemented as a pull parser but has the ability to act as a push parser through the
* DSCHandler interface.
*/
public class DSCParser implements DSCParserConstants {
@@ -49,9 +51,11 @@
private boolean checkEOF = true;
private DSCEvent currentEvent;
private DSCEvent nextEvent;
- private DSCFilter filter;
- private NestedDocumentHandler nestedDocumentHandler;
-
+ private DSCListener nestedDocumentHandler;
+ private DSCListener filterListener;
+ private List listeners;
+ private boolean listenersDisabled = false;
+
/**
* Creates a new DSC parser.
* @param in InputStream to read the PostScript file from
@@ -75,7 +79,7 @@
}
parseNext();
}
-
+
/**
* Returns the InputStream the PostScript code is read from.
* @return the InputStream the PostScript code is read from
@@ -83,7 +87,7 @@
public InputStream getInputStream() {
return this.in;
}
-
+
/**
* This method is used to write out warning messages for the parsing process. Subclass to
* override this method. The default implementation writes to System.err.
@@ -92,7 +96,7 @@
protected void warn(String msg) {
System.err.println(msg);
}
-
+
/**
* Reads one line from the input file
* @return the line or null if there are no more lines
@@ -103,7 +107,7 @@
String line;
line = this.reader.readLine();
checkLine(line);
-
+
return line;
}
@@ -116,11 +120,11 @@
warn("Line longer than 255 characters. This file is not fully PostScript conforming.");
}
}
-
+
private final boolean isWhitespace(char c) {
return c == ' ' || c == '\t';
}
-
+
private DSCComment parseDSCLine(String line) throws IOException, DSCException {
int colon = line.indexOf(':');
String name;
@@ -207,7 +211,7 @@
}
}
}
-
+
/**
* Indicates whether there are additional items.
* @return true if there are additonal items, false if the end of the file has been reached
@@ -227,15 +231,31 @@
if (hasNext()) {
this.currentEvent = nextEvent;
parseNext();
- if (this.nestedDocumentHandler != null) {
- this.nestedDocumentHandler.handle(this.currentEvent, this);
- }
+
+ processListeners();
+
return this.currentEvent.getEventType();
} else {
throw new NoSuchElementException("There are no more events");
}
}
-
+
+ private void processListeners() throws IOException, DSCException {
+ if (isListenersDisabled()) {
+ return;
+ }
+ if (this.filterListener != null) {
+ //Filter always comes first
+ this.filterListener.processEvent(this.currentEvent, this);
+ }
+ if (this.listeners != null) {
+ Iterator iter = this.listeners.iterator();
+ while (iter.hasNext()) {
+ ((DSCListener)iter.next()).processEvent(this.currentEvent, this);
+ }
+ }
+ }
+
/**
* Steps to the next item returning the new event.
* @return the new event
@@ -246,7 +266,7 @@
next();
return getCurrentEvent();
}
-
+
/**
* Returns the current event.
* @return the current event
@@ -254,7 +274,7 @@
public DSCEvent getCurrentEvent() {
return this.currentEvent;
}
-
+
/**
* Returns the next event without moving the cursor to the next event.
* @return the next event
@@ -262,7 +282,7 @@
public DSCEvent peek() {
return this.nextEvent;
}
-
+
/**
* Parses the next event.
* @throws IOException In case of an I/O error
@@ -287,14 +307,11 @@
} else {
this.nextEvent = new PostScriptLine(line);
}
- if (this.filter != null && !filter.accept(this.nextEvent)) {
- parseNext(); //skip
- }
} else {
this.nextEvent = null;
}
}
-
+
/**
* Returns the current PostScript line.
* @return the current PostScript line
@@ -315,11 +332,11 @@
* @throws IOException In case of an I/O error
* @throws DSCException In case of a violation of the DSC spec
*/
- public DSCComment nextDSCComment(String name)
+ public DSCComment nextDSCComment(String name)
throws IOException, DSCException {
return nextDSCComment(name, null);
}
-
+
/**
* Advances to the next DSC comment with the given name.
* @param name the name of the DSC comment
@@ -328,7 +345,7 @@
* @throws IOException In case of an I/O error
* @throws DSCException In case of a violation of the DSC spec
*/
- public DSCComment nextDSCComment(String name, PSGenerator gen)
+ public DSCComment nextDSCComment(String name, PSGenerator gen)
throws IOException, DSCException {
while (hasNext()) {
DSCEvent event = nextEvent();
@@ -379,16 +396,74 @@
* @param filter the filter to use or null to disable filtering
*/
public void setFilter(DSCFilter filter) {
- this.filter = filter;
+ if (filter != null) {
+ this.filterListener = new FilteringEventListener(filter);
+ } else {
+ this.filterListener = null;
+ }
+ }
+
+ /**
+ * Adds a DSC event listener.
+ * @param listener the listener
+ */
+ public void addListener(DSCListener listener) {
+ if (listener == null) {
+ throw new NullPointerException("listener must not be null");
+ }
+ if (this.listeners == null) {
+ this.listeners = new java.util.ArrayList();
+ }
+ this.listeners.add(listener);
+ }
+
+ /**
+ * Removes a DSC event listener.
+ * @param listener the listener to remove
+ */
+ public void removeListener(DSCListener listener) {
+ if (this.listeners != null) {
+ this.listeners.remove(listener);
+ }
+ }
+
+ /**
+ * Allows to disable all listeners. This can be used to disable any filtering, for example in
+ * nested documents.
+ * @param value true to disable all listeners, false to re-enable them
+ */
+ public void setListenersDisabled(boolean value) {
+ this.listenersDisabled = value;
+ }
+
+ /**
+ * Indicates whether the listeners are currently disabled.
+ * @return true if they are disabled
+ */
+ public boolean isListenersDisabled() {
+ return this.listenersDisabled;
}
/**
* Sets a NestedDocumentHandler which is used to skip nested documents like embedded EPS files.
* You can also process those parts in a special way.
+ * <p>
+ * It is suggested to use the more generally usable {@link #addListener(DSCListener)} and
+ * {@link #removeListener(DSCListener)} instead. NestedDocumentHandler is internally
+ * mapped onto a {@link DSCListener}.
* @param handler the NestedDocumentHandler instance or null to disable the feature
*/
- public void setNestedDocumentHandler(NestedDocumentHandler handler) {
- this.nestedDocumentHandler = handler;
+ public void setNestedDocumentHandler(final NestedDocumentHandler handler) {
+ if (handler == null) {
+ removeListener(this.nestedDocumentHandler);
+ } else {
+ addListener(new DSCListener() {
+ public void processEvent(DSCEvent event, DSCParser parser) throws IOException,
+ DSCException {
+ handler.handle(event, parser);
+ }
+ });
+ }
}
/**
@@ -399,7 +474,7 @@
public void setCheckEOF(boolean value) {
this.checkEOF = value;
}
-
+
/**
* Indicates whether the parser is configured to check for content after the EOF comment.
* @return true if the check is enabled.
Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DefaultNestedDocumentHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DefaultNestedDocumentHandler.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DefaultNestedDocumentHandler.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/DefaultNestedDocumentHandler.java Wed Dec 17 07:05:45 2008
@@ -5,9 +5,9 @@
* 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.
@@ -27,13 +27,14 @@
import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;
/**
- * Default implementation of the NestedDocumentHandler interface which automatically skips data
+ * {@link DSCListener} implementation which automatically skips data
* between Begin/EndDocument and Begin/EndData.
*/
-public class DefaultNestedDocumentHandler implements DSCParserConstants, NestedDocumentHandler {
+public class DefaultNestedDocumentHandler implements DSCParserConstants,
+ NestedDocumentHandler, DSCListener {
private PSGenerator gen;
-
+
/**
* Creates a new instance.
* @param gen PSGenerator to pass through the skipped content
@@ -41,37 +42,52 @@
public DefaultNestedDocumentHandler(PSGenerator gen) {
this.gen = gen;
}
-
- /**
- * @see org.apache.xmlgraphics.ps.dsc.NestedDocumentHandler#handle(org.apache.xmlgraphics.ps.dsc.events.DSCEvent, org.apache.xmlgraphics.ps.dsc.DSCParser)
- */
+
+ /** {@inheritDoc} */
public void handle(DSCEvent event, DSCParser parser) throws IOException, DSCException {
+ processEvent(event, parser);
+ }
+
+ /** {@inheritDoc} */
+ public void processEvent(DSCEvent event, DSCParser parser) throws IOException, DSCException {
if (event.isDSCComment()) {
DSCComment comment = event.asDSCComment();
if (DSCConstants.BEGIN_DOCUMENT.equals(comment.getName())) {
- comment.generate(gen);
+ if (gen != null) {
+ comment.generate(gen);
+ }
parser.setCheckEOF(false);
+ parser.setListenersDisabled(true);
comment = parser.nextDSCComment(DSCConstants.END_DOCUMENT, gen);
if (comment == null) {
- throw new DSCException("File is not DSC-compliant: Didn't find an "
+ throw new DSCException("File is not DSC-compliant: Didn't find an "
+ DSCConstants.END_DOCUMENT);
}
- comment.generate(gen);
+ if (gen != null) {
+ comment.generate(gen);
+ }
parser.setCheckEOF(true);
+ parser.setListenersDisabled(false);
parser.next();
} else if (DSCConstants.BEGIN_DATA.equals(comment.getName())) {
- comment.generate(gen);
+ if (gen != null) {
+ comment.generate(gen);
+ }
parser.setCheckEOF(false);
+ parser.setListenersDisabled(true);
comment = parser.nextDSCComment(DSCConstants.END_DATA, gen);
if (comment == null) {
- throw new DSCException("File is not DSC-compliant: Didn't find an "
+ throw new DSCException("File is not DSC-compliant: Didn't find an "
+ DSCConstants.END_DATA);
}
- comment.generate(gen);
+ if (gen != null) {
+ comment.generate(gen);
+ }
parser.setCheckEOF(true);
+ parser.setListenersDisabled(false);
parser.next();
- }
+ }
}
}
-
+
}
Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/FilteringEventListener.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/FilteringEventListener.java?rev=727407&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/FilteringEventListener.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/FilteringEventListener.java Wed Dec 17 07:05:45 2008
@@ -0,0 +1,48 @@
+/*
+ * 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.xmlgraphics.ps.dsc;
+
+import java.io.IOException;
+
+import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;
+
+/**
+ * {@code DSCListener} implementation that filters certain DSC events.
+ */
+public class FilteringEventListener implements DSCListener {
+
+ private DSCFilter filter;
+
+ /**
+ * Main constructor.
+ * @param filter the filter
+ */
+ public FilteringEventListener(DSCFilter filter) {
+ this.filter = filter;
+ }
+
+ /** {@inheritDoc} */
+ public void processEvent(DSCEvent event, DSCParser parser) throws IOException, DSCException {
+ if (!filter.accept(event)) {
+ parser.next(); //skip
+ }
+ }
+
+}
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/FilteringEventListener.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/FilteringEventListener.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/NestedDocumentHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/NestedDocumentHandler.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/NestedDocumentHandler.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/NestedDocumentHandler.java Wed Dec 17 07:05:45 2008
@@ -5,9 +5,9 @@
* 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.
@@ -28,6 +28,9 @@
* in a PostScript document. The implementation receives a parser instance so it can step forward
* until the end of the nested document is reached at which point control is given back to the
* original consumer.
+ * <p>
+ * It is suggested to use the more generally usable {@link DSCListener} instead. This
+ * interface may be deprecated in the future.
*/
public interface NestedDocumentHandler {
Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/ResourceTracker.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/ResourceTracker.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/ResourceTracker.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/ResourceTracker.java Wed Dec 17 07:05:45 2008
@@ -5,9 +5,9 @@
* 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.
@@ -23,6 +23,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
import org.apache.xmlgraphics.ps.PSGenerator;
@@ -42,7 +43,10 @@
private Set documentNeededResources;
private Set usedResources;
private Set pageResources;
-
+
+ //Map<PSResource, Integer>
+ private Map resourceUsageCounts;
+
/**
* Returns the set of supplied resources.
* @return the set of supplied resources
@@ -54,7 +58,7 @@
return Collections.EMPTY_SET;
}
}
-
+
/**
* Returns the set of needed resources.
* @return the set of needed resources
@@ -66,7 +70,7 @@
return Collections.EMPTY_SET;
}
}
-
+
/**
* Notifies the resource tracker that a new page has been started and that the page resource
* set can be cleared.
@@ -76,7 +80,7 @@
pageResources.clear();
}
}
-
+
/**
* Registers a supplied resource. If the same resources is already in the set of needed
* resources, it is removed there.
@@ -91,7 +95,7 @@
documentNeededResources.remove(res);
}
}
-
+
/**
* Registers a needed resource. If the same resources is already in the set of supplied
* resources, it is ignored, i.e. it is assumed to be supplied.
@@ -105,16 +109,34 @@
documentNeededResources.add(res);
}
}
-
+
+ private void preparePageResources() {
+ if (pageResources == null) {
+ pageResources = new java.util.HashSet();
+ }
+ }
+
+ private void prepareUsageCounts() {
+ if (resourceUsageCounts == null) {
+ resourceUsageCounts = new java.util.HashMap();
+ }
+ }
+
/**
* Notifies the resource tracker about the usage of a resource on the current page.
* @param res the resource being used
*/
public void notifyResourceUsageOnPage(PSResource res) {
- if (pageResources == null) {
- pageResources = new java.util.HashSet();
- }
+ preparePageResources();
pageResources.add(res);
+
+ prepareUsageCounts();
+ Counter counter = (Counter)resourceUsageCounts.get(res);
+ if (counter == null) {
+ resourceUsageCounts.put(res, new Counter());
+ } else {
+ counter.inc();
+ }
}
/**
@@ -122,10 +144,12 @@
* @param resources the resources being used
*/
public void notifyResourceUsageOnPage(Collection resources) {
- if (pageResources == null) {
- pageResources = new java.util.HashSet();
+ preparePageResources();
+ Iterator iter = resources.iterator();
+ while (iter.hasNext()) {
+ PSResource res = (PSResource)iter.next();
+ notifyResourceUsageOnPage(res);
}
- pageResources.addAll(resources);
}
/**
@@ -140,34 +164,101 @@
/**
* Writes a DSC comment for the accumulated used resources, either at page level or
* at document level.
- * @param pageLevel true if the DSC comment for the page level should be generated,
+ * @param pageLevel true if the DSC comment for the page level should be generated,
* false for the document level (in the trailer)
* @param gen the PSGenerator to write the DSC comments with
* @exception IOException In case of an I/O problem
*/
public void writeResources(boolean pageLevel, PSGenerator gen) throws IOException {
if (pageLevel) {
- new DSCCommentPageResources(pageResources).generate(gen);
- if (usedResources == null) {
- usedResources = new java.util.HashSet();
- }
- usedResources.addAll(pageResources);
+ writePageResources(gen);
} else {
- if (usedResources != null) {
- Iterator iter = usedResources.iterator();
- while (iter.hasNext()) {
- PSResource res = (PSResource)iter.next();
- if (documentSuppliedResources == null
- || !documentSuppliedResources.contains(res)) {
- registerNeededResource(res);
- }
+ writeDocumentResources(gen);
+ }
+ }
+
+ /**
+ * Writes a DSC comment for the accumulated used resources on the current page. Then it commits
+ * all those resources to the used resources on document level.
+ * @param gen the PSGenerator to write the DSC comments with
+ * @exception IOException In case of an I/O problem
+ */
+ public void writePageResources(PSGenerator gen) throws IOException {
+ new DSCCommentPageResources(pageResources).generate(gen);
+ if (usedResources == null) {
+ usedResources = new java.util.HashSet();
+ }
+ usedResources.addAll(pageResources);
+ }
+
+ /**
+ * Writes a DSC comment for the needed and supplied resourced for the current DSC document.
+ * @param gen the PSGenerator to write the DSC comments with
+ * @exception IOException In case of an I/O problem
+ */
+ public void writeDocumentResources(PSGenerator gen) throws IOException {
+ if (usedResources != null) {
+ Iterator iter = usedResources.iterator();
+ while (iter.hasNext()) {
+ PSResource res = (PSResource)iter.next();
+ if (documentSuppliedResources == null
+ || !documentSuppliedResources.contains(res)) {
+ registerNeededResource(res);
}
}
- new DSCCommentDocumentNeededResources(documentNeededResources).generate(gen);
- new DSCCommentDocumentSuppliedResources(documentSuppliedResources).generate(gen);
+ }
+ new DSCCommentDocumentNeededResources(documentNeededResources).generate(gen);
+ new DSCCommentDocumentSuppliedResources(documentSuppliedResources).generate(gen);
+ }
+
+ /**
+ * This method declares that the given resource will be inlined and can therefore
+ * be removed from resource tracking. This is useful when you don't know beforehand
+ * if a resource will be used multiple times. If it's only used once it's better
+ * to inline the resource to lower the maximum memory needed inside the PostScript
+ * interpreter.
+ * @param res the resource
+ */
+ public void declareInlined(PSResource res) {
+ if (this.documentNeededResources != null) {
+ this.documentNeededResources.remove(res);
+ }
+ if (this.documentSuppliedResources != null) {
+ this.documentSuppliedResources.remove(res);
+ }
+ if (this.pageResources != null) {
+ this.pageResources.remove(res);
+ }
+ if (this.usedResources != null) {
+ this.usedResources.remove(res);
}
}
-
-
-
+
+ /**
+ * Returns the number of times a resource has been used inside the current DSC document.
+ * @param res the resource
+ * @return the number of times the resource has been used
+ */
+ public long getUsageCount(PSResource res) {
+ Counter counter = (Counter)resourceUsageCounts.get(res);
+ return (counter != null ? counter.getCount() : 0);
+ }
+
+ private static class Counter {
+
+ private long count = 1;
+
+ public void inc() {
+ this.count++;
+ }
+
+ public long getCount() {
+ return this.count;
+ }
+
+ public String toString() {
+ return Long.toString(this.count);
+ }
+ }
+
}
Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourceDSCComment.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourceDSCComment.java?rev=727407&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourceDSCComment.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourceDSCComment.java Wed Dec 17 07:05:45 2008
@@ -0,0 +1,100 @@
+/*
+ * 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.xmlgraphics.ps.dsc.events;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.xmlgraphics.ps.PSGenerator;
+import org.apache.xmlgraphics.ps.PSProcSet;
+import org.apache.xmlgraphics.ps.PSResource;
+
+/**
+ * Abstract base class for resource comments.
+ */
+public abstract class AbstractResourceDSCComment extends AbstractDSCComment {
+
+ private PSResource resource;
+
+ /**
+ * Creates a new instance
+ */
+ public AbstractResourceDSCComment() {
+ }
+
+ /**
+ * Creates a new instance for a given PSResource instance
+ * @param resource the resource
+ */
+ public AbstractResourceDSCComment(PSResource resource) {
+ this.resource = resource;
+ }
+
+ /**
+ * Returns the associated PSResource.
+ * @return the resource
+ */
+ public PSResource getResource() {
+ return this.resource;
+ }
+
+ /** {@inheritDoc} */
+ public boolean hasValues() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ public void parseValue(String value) {
+ List params = splitParams(value);
+ Iterator iter = params.iterator();
+ String name = (String)iter.next();
+ if (PSResource.TYPE_FONT.equals(name)) {
+ String fontname = (String)iter.next();
+ this.resource = new PSResource(name, fontname);
+ } else if (PSResource.TYPE_PROCSET.equals(name)) {
+ String procname = (String)iter.next();
+ String version = (String)iter.next();
+ String revision = (String)iter.next();
+ this.resource = new PSProcSet(procname,
+ Float.parseFloat(version), Integer.parseInt(revision));
+ } else if (PSResource.TYPE_FILE.equals(name)) {
+ String filename = (String)iter.next();
+ this.resource = new PSResource(name, filename);
+ } else if (PSResource.TYPE_FORM.equals(name)) {
+ String formname = (String)iter.next();
+ this.resource = new PSResource(name, formname);
+ } else if (PSResource.TYPE_PATTERN.equals(name)) {
+ String patternname = (String)iter.next();
+ this.resource = new PSResource(name, patternname);
+ } else if (PSResource.TYPE_ENCODING.equals(name)) {
+ String encodingname = (String)iter.next();
+ this.resource = new PSResource(name, encodingname);
+ } else {
+ throw new IllegalArgumentException("Invalid resource type: " + name);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void generate(PSGenerator gen) throws IOException {
+ gen.writeDSCComment(getName(), getResource());
+ }
+
+}
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourceDSCComment.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourceDSCComment.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourcesDSCComment.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourcesDSCComment.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourcesDSCComment.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/AbstractResourcesDSCComment.java Wed Dec 17 07:05:45 2008
@@ -5,9 +5,9 @@
* 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.
@@ -31,20 +31,20 @@
import org.apache.xmlgraphics.ps.PSResource;
/**
- * Abstract base class for Resource DSC comments (DocumentNeededResources,
+ * Abstract base class for Resource DSC comments (DocumentNeededResources,
* DocumentSuppliedResources and PageResources).
*/
public abstract class AbstractResourcesDSCComment extends AbstractDSCComment {
private Set resources;
-
+
/**
* Creates a new instance.
*/
public AbstractResourcesDSCComment() {
super();
}
-
+
/**
* Creates a new instance.
* @param resources a Collection of PSResource instances
@@ -52,38 +52,38 @@
public AbstractResourcesDSCComment(Collection resources) {
addResources(resources);
}
-
- /**
- * @see org.apache.xmlgraphics.ps.dsc.events.DSCComment#hasValues()
- */
+
+ /** {@inheritDoc} */
public boolean hasValues() {
return true;
}
+ private void prepareResourceSet() {
+ if (this.resources == null) {
+ this.resources = new java.util.TreeSet();
+ }
+ }
+
/**
* Adds a new resource.
* @param res the resource
*/
public void addResource(PSResource res) {
- if (this.resources == null) {
- this.resources = new java.util.HashSet();
- }
+ prepareResourceSet();
this.resources.add(res);
}
-
+
/**
* Adds a collection of resources.
- * @param resources a Collection of PSResource instances.
+ * @param resources a Collection of PSResource instances.
*/
public void addResources(Collection resources) {
if (resources != null) {
- if (this.resources == null) {
- this.resources = new java.util.HashSet();
- }
+ prepareResourceSet();
this.resources.addAll(resources);
}
}
-
+
/**
* Returns the set of resources associated with this DSC comment.
* @return the set of resources
@@ -91,12 +91,12 @@
public Set getResources() {
return Collections.unmodifiableSet(this.resources);
}
-
+
/**
* Defines the known resource types (font, procset, file, pattern etc.).
*/
protected static final Set RESOURCE_TYPES = new java.util.HashSet();
-
+
static {
RESOURCE_TYPES.add(PSResource.TYPE_FONT);
RESOURCE_TYPES.add(PSResource.TYPE_PROCSET);
@@ -105,10 +105,8 @@
RESOURCE_TYPES.add(PSResource.TYPE_FORM);
RESOURCE_TYPES.add(PSResource.TYPE_ENCODING);
}
-
- /**
- * @see org.apache.xmlgraphics.ps.dsc.events.DSCComment#parseValue(java.lang.String)
- */
+
+ /** {@inheritDoc} */
public void parseValue(String value) {
List params = splitParams(value);
String currentResourceType = null;
@@ -132,7 +130,7 @@
String procname = (String)iter.next();
String version = (String)iter.next();
String revision = (String)iter.next();
- addResource(new PSProcSet(procname,
+ addResource(new PSProcSet(procname,
Float.parseFloat(version), Integer.parseInt(revision)));
} else if (PSResource.TYPE_FILE.equals(currentResourceType)) {
String filename = (String)iter.next();
@@ -143,10 +141,7 @@
}
}
- /**
- * @see org.apache.xmlgraphics.ps.dsc.events.DSCEvent#generate(
- * org.apache.xmlgraphics.ps.PSGenerator)
- */
+ /** {@inheritDoc} */
public void generate(PSGenerator gen) throws IOException {
if (resources == null || resources.size() == 0) {
return;
Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginDocument.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginDocument.java?rev=727407&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginDocument.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginDocument.java Wed Dec 17 07:05:45 2008
@@ -0,0 +1,131 @@
+/*
+ * 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.xmlgraphics.ps.dsc.events;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.xmlgraphics.ps.DSCConstants;
+import org.apache.xmlgraphics.ps.PSGenerator;
+import org.apache.xmlgraphics.ps.PSResource;
+
+/**
+ * Represents a %BeginDocument DSC comment.
+ */
+public class DSCCommentBeginDocument extends AbstractDSCComment {
+
+ private PSResource resource;
+ private Float version;
+ private String type;
+
+ /**
+ * Creates a new instance
+ */
+ public DSCCommentBeginDocument() {
+ super();
+ }
+
+ /**
+ * Creates a new instance for a given PSResource instance
+ * @param resource the resource
+ */
+ public DSCCommentBeginDocument(PSResource resource) {
+ this.resource = resource;
+ if (resource != null && !PSResource.TYPE_FILE.equals(resource.getType())) {
+ throw new IllegalArgumentException("Resource must be of type 'file'");
+ }
+ }
+
+ /**
+ * Creates a new instance for a given PSResource instance
+ * @param resource the resource
+ * @param version the version of the resource (or null)
+ * @param type the type of resource (or null)
+ */
+ public DSCCommentBeginDocument(PSResource resource, Float version, String type) {
+ this(resource);
+ this.version = version;
+ this.type = type;
+ }
+
+ /**
+ * Returns the resource version.
+ * @return the resource version (or null if not applicable)
+ */
+ public Float getVersion() {
+ return this.version;
+ }
+
+ /**
+ * Returns the resource type
+ * @return the resource type (or null if not applicable)
+ */
+ public String getType() {
+ return this.type;
+ }
+
+ /** {@inheritDoc} */
+ public String getName() {
+ return DSCConstants.BEGIN_DOCUMENT;
+ }
+
+ /**
+ * Returns the associated PSResource.
+ * @return the resource
+ */
+ public PSResource getResource() {
+ return this.resource;
+ }
+
+ /** {@inheritDoc} */
+ public boolean hasValues() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ public void parseValue(String value) {
+ List params = splitParams(value);
+ Iterator iter = params.iterator();
+ String name = (String)iter.next();
+ this.resource = new PSResource(PSResource.TYPE_FILE, name);
+ if (iter.hasNext()) {
+ this.version = new Float(iter.next().toString());
+ this.type = null;
+ if (iter.hasNext()) {
+ this.type = (String)iter.next();
+ }
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void generate(PSGenerator gen) throws IOException {
+ List params = new java.util.ArrayList();
+ params.add(getResource().getName());
+ if (getVersion() != null) {
+ params.add(getVersion());
+ if (getType() != null) {
+ params.add(getType());
+ }
+ }
+ gen.writeDSCComment(getName(), params.toArray());
+ }
+
+}
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginDocument.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginDocument.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginResource.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginResource.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginResource.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentBeginResource.java Wed Dec 17 07:05:45 2008
@@ -5,9 +5,9 @@
* 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.
@@ -20,27 +20,24 @@
package org.apache.xmlgraphics.ps.dsc.events;
import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
import org.apache.xmlgraphics.ps.DSCConstants;
import org.apache.xmlgraphics.ps.PSGenerator;
-import org.apache.xmlgraphics.ps.PSProcSet;
import org.apache.xmlgraphics.ps.PSResource;
/**
* Represents a %BeginResource DSC comment.
*/
-public class DSCCommentBeginResource extends AbstractDSCComment {
+public class DSCCommentBeginResource extends AbstractResourceDSCComment {
- private PSResource resource;
private Integer min;
private Integer max;
-
+
/**
* Creates a new instance
*/
public DSCCommentBeginResource() {
+ super();
}
/**
@@ -48,9 +45,9 @@
* @param resource the resource
*/
public DSCCommentBeginResource(PSResource resource) {
- this.resource = resource;
+ super(resource);
}
-
+
/**
* Creates a new instance for a given PSResource instance
* @param resource the resource
@@ -58,19 +55,11 @@
* @param max Maximum VM used by the resource
*/
public DSCCommentBeginResource(PSResource resource, int min, int max) {
- this.resource = resource;
+ super(resource);
this.min = new Integer(min);
this.max = new Integer(max);
}
-
- /**
- * Returns the associated PSResource.
- * @return the resource
- */
- public PSResource getResource() {
- return this.resource;
- }
-
+
/**
* Returns the minimum VM used by the resource.
* @return the minimum VM used by the resource
@@ -78,7 +67,7 @@
public Integer getMin() {
return this.min;
}
-
+
/**
* Returns the maximum VM used by the resource.
* @return the maximum VM used by the resource
@@ -87,54 +76,18 @@
return this.max;
}
- /**
- * @see org.apache.xmlgraphics.ps.dsc.events.DSCComment#getName()
- */
+ /** {@inheritDoc} */
public String getName() {
return DSCConstants.BEGIN_RESOURCE;
}
- /**
- * @see org.apache.xmlgraphics.ps.dsc.events.DSCComment#hasValues()
- */
- public boolean hasValues() {
- return true;
- }
-
- /**
- * @see org.apache.xmlgraphics.ps.dsc.events.DSCComment#parseValue(java.lang.String)
- */
- public void parseValue(String value) {
- List params = splitParams(value);
- Iterator iter = params.iterator();
- String name = (String)iter.next();
- if (PSResource.TYPE_FONT.equals(name)) {
- String fontname = (String)iter.next();
- this.resource = new PSResource(name, fontname);
- } else if (PSResource.TYPE_PROCSET.equals(name)) {
- String procname = (String)iter.next();
- String version = (String)iter.next();
- String revision = (String)iter.next();
- this.resource = new PSProcSet(procname,
- Float.parseFloat(version), Integer.parseInt(revision));
- } else if (PSResource.TYPE_FILE.equals(name)) {
- String filename = (String)iter.next();
- this.resource = new PSResource(name, filename);
- } else {
- throw new IllegalArgumentException("Invalid resource type: " + name);
- }
- }
-
- /**
- * @see org.apache.xmlgraphics.ps.dsc.events.DSCEvent#generate(
- * org.apache.xmlgraphics.ps.PSGenerator)
- */
+ /** {@inheritDoc} */
public void generate(PSGenerator gen) throws IOException {
if (getMin() != null) {
Object[] params = new Object[] {getResource(), getMin(), getMax()};
gen.writeDSCComment(getName(), params);
} else {
- gen.writeDSCComment(getName(), getResource());
+ super.generate(gen);
}
}
Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentIncludeResource.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentIncludeResource.java?rev=727407&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentIncludeResource.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentIncludeResource.java Wed Dec 17 07:05:45 2008
@@ -0,0 +1,50 @@
+/*
+ * 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.xmlgraphics.ps.dsc.events;
+
+import org.apache.xmlgraphics.ps.DSCConstants;
+import org.apache.xmlgraphics.ps.PSResource;
+
+/**
+ * Represents a %IncludeResource DSC comment.
+ */
+public class DSCCommentIncludeResource extends AbstractResourceDSCComment {
+
+ /**
+ * Creates a new instance
+ */
+ public DSCCommentIncludeResource() {
+ super();
+ }
+
+ /**
+ * Creates a new instance for a given PSResource instance
+ * @param resource the resource
+ */
+ public DSCCommentIncludeResource(PSResource resource) {
+ super(resource);
+ }
+
+ /** {@inheritDoc} */
+ public String getName() {
+ return DSCConstants.INCLUDE_RESOURCE;
+ }
+
+}
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentIncludeResource.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentIncludeResource.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentTitle.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentTitle.java?rev=727407&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentTitle.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentTitle.java Wed Dec 17 07:05:45 2008
@@ -0,0 +1,80 @@
+/*
+ * 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.xmlgraphics.ps.dsc.events;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.xmlgraphics.ps.DSCConstants;
+import org.apache.xmlgraphics.ps.PSGenerator;
+
+/**
+ * Represents a %%Title DSC comment.
+ */
+public class DSCCommentTitle extends AbstractDSCComment {
+
+ private String title;
+
+ /**
+ * Creates a new instance.
+ */
+ public DSCCommentTitle() {
+ }
+
+ /**
+ * Creates a new instance.
+ * @param title the title text
+ */
+ public DSCCommentTitle(String title) {
+ this.title = title;
+ }
+
+ /**
+ * Returns the title.
+ * @return the title
+ */
+ public String getTitle() {
+ return this.title;
+ }
+
+ /** {@inheritDoc} */
+ public String getName() {
+ return DSCConstants.TITLE;
+ }
+
+ /** {@inheritDoc} */
+ public boolean hasValues() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ public void parseValue(String value) {
+ List params = splitParams(value);
+ Iterator iter = params.iterator();
+ this.title = (String)iter.next();
+ }
+
+ /** {@inheritDoc} */
+ public void generate(PSGenerator gen) throws IOException {
+ gen.writeDSCComment(getName(), getTitle());
+ }
+
+}
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentTitle.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/events/DSCCommentTitle.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/tools/PageExtractor.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/tools/PageExtractor.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/tools/PageExtractor.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/dsc/tools/PageExtractor.java Wed Dec 17 07:05:45 2008
@@ -5,9 +5,9 @@
* 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.
@@ -40,18 +40,18 @@
* This class can extract a certain range of pages from a DSC-compliant PostScript file.
*/
public class PageExtractor implements DSCParserConstants {
-
+
/**
* Parses a DSC-compliant file and pipes the content through to the OutputStream omitting
* all pages not within the range.
- * @param in the InputStream to parse from
+ * @param in the InputStream to parse from
* @param out the OutputStream to write the modified file to
* @param from the starting page (1-based)
* @param to the last page (inclusive, 1-based)
* @throws IOException In case of an I/O error
* @throws DSCException In case of a violation of the DSC spec
*/
- public static void extractPages(InputStream in, OutputStream out, int from, int to)
+ public static void extractPages(InputStream in, OutputStream out, int from, int to)
throws IOException, DSCException {
if (from <= 0) {
throw new IllegalArgumentException("'from' page number must be 1 or higher");
@@ -60,12 +60,12 @@
throw new IllegalArgumentException(
"'to' page number must be equal or larger than the 'from' page number");
}
-
+
DSCParser parser = new DSCParser(in);
PSGenerator gen = new PSGenerator(out);
- parser.setNestedDocumentHandler(new DefaultNestedDocumentHandler(gen));
+ parser.addListener(new DefaultNestedDocumentHandler(gen));
int pageCount = 0;
-
+
//Skip DSC header
DSCHeaderComment header = DSCTools.checkAndSkipDSC30Header(parser);
header.generate(gen);
@@ -90,7 +90,7 @@
throw new DSCException("Page expected, but none found");
}
parser.setFilter(null); //Remove filter
-
+
//Process individual pages (and skip as necessary)
while (true) {
DSCCommentPage page = (DSCCommentPage)pageOrTrailer;
@@ -108,12 +108,12 @@
break;
}
}
-
+
//Write the rest
while (parser.hasNext()) {
DSCEvent event = parser.nextEvent();
event.generate(gen);
}
}
-
+
}
\ No newline at end of file
Modified: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/StandardTestSuite.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/StandardTestSuite.java?rev=727407&r1=727406&r2=727407&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/StandardTestSuite.java (original)
+++ xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/StandardTestSuite.java Wed Dec 17 07:05:45 2008
@@ -19,8 +19,12 @@
package org.apache.xmlgraphics;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
import org.apache.xmlgraphics.image.codec.png.PNGEncoderTest;
import org.apache.xmlgraphics.ps.PSEscapeTestCase;
+import org.apache.xmlgraphics.ps.dsc.ListenerTestCase;
import org.apache.xmlgraphics.ps.dsc.events.DSCValueParserTestCase;
import org.apache.xmlgraphics.ps.dsc.tools.DSCToolsTestCase;
import org.apache.xmlgraphics.util.ClasspathResourceTest;
@@ -30,9 +34,6 @@
import org.apache.xmlgraphics.util.io.ASCII85OutputStreamTestCase;
import org.apache.xmlgraphics.util.io.Base64Test;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
/**
* Test suite for basic functionality of XML Graphics Commons.
*/
@@ -55,6 +56,7 @@
suite.addTest(new TestSuite(PSEscapeTestCase.class));
suite.addTest(new TestSuite(DSCValueParserTestCase.class));
suite.addTest(new TestSuite(DSCToolsTestCase.class));
+ suite.addTest(new TestSuite(ListenerTestCase.class));
suite.addTest(new TestSuite(UnitConvTestCase.class));
//$JUnit-END$
return suite;
Added: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/ListenerTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/ListenerTestCase.java?rev=727407&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/ListenerTestCase.java (added)
+++ xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/ListenerTestCase.java Wed Dec 17 07:05:45 2008
@@ -0,0 +1,125 @@
+/*
+ * 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.xmlgraphics.ps.dsc;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.io.IOUtils;
+
+import org.apache.xmlgraphics.ps.DSCConstants;
+import org.apache.xmlgraphics.ps.dsc.events.DSCComment;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentLanguageLevel;
+import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;
+
+/**
+ * Tests the listener functionality on the DSC parser.
+ */
+public class ListenerTestCase extends TestCase {
+
+ /**
+ * Tests {@link DSCParser#setFilter(DSCFilter)}.
+ * @throws Exception if an error occurs
+ */
+ public void testFilter() throws Exception {
+ InputStream in = getClass().getResourceAsStream("test1.txt");
+ try {
+ DSCParser parser = new DSCParser(in);
+ parser.setFilter(new DSCFilter() {
+
+ public boolean accept(DSCEvent event) {
+ //Filter out all non-DSC comments
+ return !event.isComment();
+ }
+
+ });
+ while (parser.hasNext()) {
+ DSCEvent event = parser.nextEvent();
+
+ if (parser.getCurrentEvent().isComment()) {
+ fail("Filter failed. Comment found.");
+ }
+ }
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+ }
+
+ /**
+ * Tests listeners on DSCParser.
+ * @throws Exception if an error occurs
+ */
+ public void testListeners() throws Exception {
+ InputStream in = getClass().getResourceAsStream("test1.txt");
+ try {
+ final Map results = new java.util.HashMap();
+ DSCParser parser = new DSCParser(in);
+
+ //Filter the prolog
+ parser.addListener(new DSCListener() {
+ public void processEvent(DSCEvent event, DSCParser parser)
+ throws IOException, DSCException {
+ if (event.isDSCComment()) {
+ DSCComment comment = event.asDSCComment();
+ if (DSCConstants.BEGIN_PROLOG.equals(comment.getName())) {
+ //Skip until end of prolog
+ while (parser.hasNext()) {
+ DSCEvent e = parser.nextEvent();
+ if (e.isDSCComment()) {
+ if (DSCConstants.END_PROLOG.equals(
+ e.asDSCComment().getName())) {
+ parser.next();
+ break;
+ }
+ }
+
+ }
+ }
+ }
+ }
+ });
+
+ //Listener for the language level
+ parser.addListener(new DSCListener() {
+ public void processEvent(DSCEvent event, DSCParser parser)
+ throws IOException, DSCException {
+ if (event instanceof DSCCommentLanguageLevel) {
+ DSCCommentLanguageLevel level = (DSCCommentLanguageLevel)event;
+ results.put("level", new Integer(level.getLanguageLevel()));
+ }
+ }
+ });
+ int count = 0;
+ while (parser.hasNext()) {
+ DSCEvent event = parser.nextEvent();
+ System.out.println(event);
+ count++;
+ }
+ assertEquals(12, count);
+ assertEquals(new Integer(1), results.get("level"));
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+ }
+
+}
Propchange: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/ListenerTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/ListenerTestCase.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/test1.txt
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/test1.txt?rev=727407&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/test1.txt (added)
+++ xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/test1.txt Wed Dec 17 07:05:45 2008
@@ -0,0 +1,15 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 136 43
+%%LanguageLevel: 1
+%Custom comment
+%%EndComments
+%%BeginProlog
+prologing
+%%EndProlog
+dummy postscript
+dummy postscript
+%Custom comment
+dummy postscript
+dummy postscript
+dummy postscript
+%%EOF
Propchange: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/ps/dsc/test1.txt
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: commits-help@xmlgraphics.apache.org