acoliver 02/04/27 06:33:04
Modified: src/java/org/apache/poi/hssf/eventmodel
HSSFEventFactory.java HSSFRequest.java
Added: src/java/org/apache/poi/hssf/eventmodel
AbortableHSSFListener.java HSSFUserException.java
Log:
looks like I had stuff locally that I forgot to commit (oops) . Thsi patch from
Carey Sublette
Makes the event based API abortable.
Revision Changes Path
1.3 +133 -70
jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/HSSFEventFactory.java
Index: HSSFEventFactory.java
===================================================================
RCS file:
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/HSSFEventFactory.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- HSSFEventFactory.java 19 Feb 2002 22:55:34 -0000 1.2
+++ HSSFEventFactory.java 27 Apr 2002 13:33:04 -0000 1.3
@@ -59,6 +59,7 @@
import java.io.IOException;
import org.apache.poi.util.LittleEndian;
+import org.apache.poi.hssf.HSSFUserException;
import org.apache.poi.hssf.record.RecordFormatException;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RecordFactory;
@@ -76,12 +77,12 @@
*
* @see org.apache.poi.hssf.dev.EFHSSF
*
- * @author andy
+ * @author Andrew C. Oliver (acoliver at apache dot org)
+ * @authro Carey Sublette ([EMAIL PROTECTED])
*/
public class HSSFEventFactory
{
-
/** Creates a new instance of HSSFEventFactory */
public HSSFEventFactory()
@@ -102,9 +103,28 @@
processEvents(req, in);
}
+
+ /**
+ * Processes a file into essentially record events.
+ *
+ * @param req an Instance of HSSFRequest which has your registered
listeners
+ * @param fs a POIFS filesystem containing your workbook
+ * @return numeric user-specified result code.
+ */
+
+ public short abortableProcessWorkbookEvents(HSSFRequest req, POIFSFileSystem
fs)
+ throws IOException, HSSFUserException
+ {
+ InputStream in = fs.createDocumentInputStream("Workbook");
+ return abortableProcessEvents(req, in);
+ }
/**
* Processes a DocumentInputStream into essentially Record events.
+ *
+ * If an <code>AbortableHSSFListener</code> causes a halt to processing during
this call
+ * the method will return just as with <code>abortableProcessEvents</code>, but
no
+ * user code or <code>HSSFUserException</code> will be passed back.
*
* @see
org.apache.poi.poifs.filesystem.POIFSFileSystem#createDocumentInputStream(String)
* @param req an Instance of HSSFRequest which has your registered
listeners
@@ -113,74 +133,117 @@
public void processEvents(HSSFRequest req, InputStream in)
throws IOException
+ {
+ try
+ {
+ genericProcessEvents(req, in);
+ }
+ catch (HSSFUserException hue)
+ {/*If an HSSFUserException user exception is thrown, ignore it.*/ }
+ }
+
+
+ /**
+ * Processes a DocumentInputStream into essentially Record events.
+ *
+ * @see
org.apache.poi.poifs.filesystem.POIFSFileSystem#createDocumentInputStream(String)
+ * @param req an Instance of HSSFRequest which has your registered
listeners
+ * @param in a DocumentInputStream obtained from POIFS's POIFSFileSystem
object
+ * @return numeric user-specified result code.
+ */
+
+ public short abortableProcessEvents(HSSFRequest req, InputStream in)
+ throws IOException, HSSFUserException
{
- try
- {
- byte[] sidbytes = new byte[ 2 ];
- int bytesread = in.read(sidbytes);
- Record rec = null;
-
- while (bytesread > 0)
- {
- short sid = 0;
-
- sid = LittleEndian.getShort(sidbytes);
- if ((rec != null) && (sid != ContinueRecord.sid))
- {
- req.processRecord(rec);
- }
- if (sid != ContinueRecord.sid)
- {
- short size = LittleEndian.readShort(in);
- byte[] data = new byte[ size ];
-
- if (data.length > 0)
- {
- in.read(data);
- }
- Record[] recs = RecordFactory.createRecord(sid, size,
- data);
-
- if (recs.length > 1)
- { // we know that the multiple
- for (int k = 0; k < (recs.length - 1); k++)
- { // record situations do not
- req.processRecord(
- recs[ k ]); // contain continue records
- }
- }
- rec = recs[ recs.length - 1 ]; // regardless we'll process
-
- // the last record as though
- // it might be continued
- // if there is only one
- // records, it will go here too.
- }
- else
- { // we do have a continue record
- short size = LittleEndian.readShort(in);
- byte[] data = new byte[ size ];
-
- if (data.length > 0)
- {
- in.read(data);
- }
- rec.processContinueRecord(data);
- }
- bytesread = in.read(sidbytes); // read next record sid
- }
- if (rec != null)
- {
- req.processRecord(rec);
- }
- }
- catch (IOException e)
- {
- throw new RecordFormatException("Error reading bytes");
- }
-
- // Record[] retval = new Record[ records.size() ];
- // retval = ( Record [] ) records.toArray(retval);
- // return null;
+ return genericProcessEvents(req, in);
+ }
+
+ /**
+ * Processes a DocumentInputStream into essentially Record events.
+ *
+ * @see
org.apache.poi.poifs.filesystem.POIFSFileSystem#createDocumentInputStream(String)
+ * @param req an Instance of HSSFRequest which has your registered
listeners
+ * @param in a DocumentInputStream obtained from POIFS's
POIFSFileSystem object
+ * @param in a DocumentInputStream obtained from POIFS's
POIFSFileSystem object
+ * @return numeric user-specified result code.
+ */
+
+ protected short genericProcessEvents(HSSFRequest req, InputStream in)
+ throws IOException, HSSFUserException
+ {
+ short userCode = 0;
+ process:
+ try
+ {
+ byte[] sidbytes = new byte[ 2 ];
+ int bytesread = in.read(sidbytes);
+ Record rec = null;
+
+ while (bytesread > 0)
+ {
+ short sid = 0;
+
+ sid = LittleEndian.getShort(sidbytes);
+ if ((rec != null) && (sid != ContinueRecord.sid))
+ {
+ userCode = req.processRecord(rec);
+ if (userCode != 0) break process;
+ }
+ if (sid != ContinueRecord.sid)
+ {
+ short size = LittleEndian.readShort(in);
+ byte[] data = new byte[ size ];
+
+ if (data.length > 0)
+ {
+ in.read(data);
+ }
+ Record[] recs =
RecordFactory.createRecord(sid, size,
+
data);
+
+ if (recs.length > 1)
+ { // we know
that the multiple
+ for (int k = 0; k < (recs.length - 1);
k++)
+ { // record
situations do not
+ userCode = req.processRecord(
+ recs[ k ]);
// contain continue records
+ if (userCode != 0) break
process;
+ }
+ }
+ rec = recs[ recs.length - 1 ]; // regardless
we'll process
+
+ // the last record as though
+ // it might be continued
+ // if there is only one
+ // records, it will go here too.
+ }
+ else
+ { // we do have a
continue record
+ short size = LittleEndian.readShort(in);
+ byte[] data = new byte[ size ];
+
+ if (data.length > 0)
+ {
+ in.read(data);
+ }
+ rec.processContinueRecord(data);
+ }
+ bytesread = in.read(sidbytes); // read next
record sid
+ }
+ if (rec != null)
+ {
+ userCode = req.processRecord(rec);
+ if (userCode != 0) break process;
+ }
+ }
+ catch (IOException e)
+ {
+ throw new RecordFormatException("Error reading bytes");
+ }
+ return userCode;
+
+ // Record[] retval = new Record[ records.size() ];
+ // retval = ( Record [] ) records.toArray(retval);
+ // return null;
}
}
1.3 +29 -10
jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/HSSFRequest.java
Index: HSSFRequest.java
===================================================================
RCS file:
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/HSSFRequest.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- HSSFRequest.java 19 Feb 2002 22:55:34 -0000 1.2
+++ HSSFRequest.java 27 Apr 2002 13:33:04 -0000 1.3
@@ -9,7 +9,7 @@
* modification, are permitted provided that the following conditions
* are met:
*
- * 1. Redistributions of source code must retain the above copyright
+ * 1. Redistributions of source userCode must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
@@ -59,6 +59,7 @@
import java.util.List;
import java.util.ArrayList;
+import org.apache.poi.hssf.HSSFUserException;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RecordFactory;
@@ -69,7 +70,9 @@
* @see org.apache.poi.hssf.eventmodel.HSSFEventFactory
* @see org.apache.poi.hssf.eventmodel.HSSFListener
* @see org.apache.poi.hssf.dev.EFHSSF
- * @author andy
+ * @see org.apache.poi.hssf.HSSFUserException
+ * @author Andrew C. Oliver (acoliver at apache dot org)
+ * @author Carey Sublette ([EMAIL PROTECTED])
*/
public class HSSFRequest
@@ -137,14 +140,20 @@
}
}
- /**
- * called by HSSFEventFactory, passes the Record to each listener associated
with
- * a record.sid.
- */
+ /**
+ * Called by HSSFEventFactory, passes the Record to each listener associated
with
+ * a record.sid.
+ *
+ * Exception and return value added 2002-04-19 by Carey Sublette
+ *
+ * @return numeric user-specified result code. If zero continue processing.
+ * @throws HSSFUserException User exception condition
+ */
- protected void processRecord(Record rec)
+ protected short processRecord(Record rec) throws HSSFUserException
{
Object obj = records.get(new Short(rec.getSid()));
+ short userCode = 0;
if (obj != null)
{
@@ -152,10 +161,20 @@
for (int k = 0; k < listeners.size(); k++)
{
- HSSFListener listener = ( HSSFListener ) listeners.get(k);
-
- listener.processRecord(rec);
+ Object listenObj = listeners.get(k);
+ if (listenObj instanceof AbortableHSSFListener)
+ {
+ AbortableHSSFListener listener = (
AbortableHSSFListener ) listenObj;
+ userCode = listener.abortableProcessRecord(rec);
+ if (userCode!=0) break;
+ }
+ else
+ {
+ HSSFListener listener = ( HSSFListener )
listenObj;
+ listener.processRecord(rec);
+ }
}
}
+ return userCode;
}
}
1.1
jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/AbortableHSSFListener.java
Index: AbortableHSSFListener.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, 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 "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", 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 (INCLUDING, 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. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hssf.eventmodel;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.HSSFUserException;
/**
* Interface for use with the HSSFRequest and HSSFEventFactory. Users should create
* a listener supporting this interface and register it with the HSSFRequest
(associating
* it with Record SID's).
*
* @see org.apache.poi.hssf.eventmodel.HSSFEventFactory
* @see org.apache.poi.hssf.eventmodel.HSSFRequest
* @see org.apache.poi.hssf.HSSFUserException
*
* @author Carey Sublette ([EMAIL PROTECTED])
*
*/
public abstract class AbortableHSSFListener implements HSSFListener
{
/**
* This method, inherited from HSSFListener is implemented as a stub.
* It is never called by HSSFEventFActory or HSSFRequest.
*
*/
public void processRecord(Record record)
{
}
/**
* Process an HSSF Record. Called when a record occurs in an HSSF file.
* Provides two options for halting the processing of the HSSF file.
*
* The return value provides a means of non-error termination with a
* user-defined result code. A value of zero must be returned to
* continue processing, any other value will halt processing by
* <code>HSSFEventFactory</code> with the code being passed back by
* its abortable process events methods.
*
* Error termination can be done by throwing the HSSFUserException.
*
* Note that HSSFEventFactory will not call the inherited process
*
* @return result code of zero for continued processing.
*
* @throws HSSFUserException User code can throw this to abort
* file processing by HSSFEventFactory and return diagnostic information.
*/
public abstract short abortableProcessRecord(Record record) throws
HSSFUserException;
}
1.1
jakarta-poi/src/java/org/apache/poi/hssf/eventmodel/HSSFUserException.java
Index: HSSFUserException.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, 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 "Apache" 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 [EMAIL PROTECTED]
*
* 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 (INCLUDING, 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. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* Portions of this software are based upon public domain software
* originally written at the National Center for Supercomputing Applications,
* University of Illinois, Urbana-Champaign.
*/
package org.apache.poi.hssf;
/**
* <p>This exception is provided as a way for API users to throw
* exceptions from their event handling code. By doing so they
* abort file processing by the HSSFEventFactory and by
* catching it from outside the HSSFEventFactory.processEvents
* method they can diagnose the cause for the abort.</p>
*
* <p>The HSSFUserException supports a nested "reason"
* throwable, i.e. an exception that caused this one to be thrown.</p>
*
* <p>The HSSF package does not itself throw any of these
* exceptions.</p>
*
* @author Rainer Klute ([EMAIL PROTECTED])
* @author Carey Sublette ([EMAIL PROTECTED])
* @version HSSFUserException.java,v 1.0
* @since 2002-04-19
*/
public class HSSFUserException extends Exception
{
private Throwable reason;
/**
* <p>Creates a new {@link HSSFUserException}.</p>
*/
public HSSFUserException()
{
super();
}
/**
* <p>Creates a new {@link HSSFUserException} with a message
* string.</p>
*/
public HSSFUserException(final String msg)
{
super(msg);
}
/**
* <p>Creates a new {@link HSSFUserException} with a reason.</p>
*/
public HSSFUserException(final Throwable reason)
{
super();
this.reason = reason;
}
/**
* <p>Creates a new {@link HSSFUserException} with a message string
* and a reason.</p>
*/
public HSSFUserException(final String msg, final Throwable reason)
{
super(msg);
this.reason = reason;
}
/**
* <p>Returns the {@link Throwable} that caused this exception to
* be thrown or <code>null</code> if there was no such {@link
* Throwable}.</p>
*/
public Throwable getReason()
{
return reason;
}
}