From ffb03d993ee10e1e128f6cec33a33479efd6a2af Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Mon, 16 Mar 2009 07:03:13 +0000 Subject: [PATCH] Abstracted record construction git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@754828 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/record/RecordFactory.java | 59 +++++++++++++------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/java/org/apache/poi/hssf/record/RecordFactory.java b/src/java/org/apache/poi/hssf/record/RecordFactory.java index b50156dbce..e59d4fe9e1 100644 --- a/src/java/org/apache/poi/hssf/record/RecordFactory.java +++ b/src/java/org/apache/poi/hssf/record/RecordFactory.java @@ -45,6 +45,37 @@ import org.apache.poi.hssf.record.pivottable.*; */ public final class RecordFactory { private static final int NUM_RECORDS = 512; + + private interface I_RecordCreator { + Record create(RecordInputStream in); + + String getRecordClassName(); + } + private static final class ReflectionRecordCreator implements I_RecordCreator { + + private final Constructor _c; + public ReflectionRecordCreator(Constructor c) { + _c = c; + } + public Record create(RecordInputStream in) { + Object[] args = { in, }; + try { + return _c.newInstance(args); + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RecordFormatException("Unable to construct record instance" , e.getTargetException()); + } + } + public String getRecordClassName() { + return _c.getDeclaringClass().getName(); + } + } + private static final Class[] CONSTRUCTOR_ARGS = { RecordInputStream.class, }; @@ -189,7 +220,7 @@ public final class RecordFactory { /** * cache of the recordsToMap(); */ - private static Map> recordsMap = recordsToMap(recordClasses); + private static Map recordsMap = recordsToMap(recordClasses); private static short[] _allKnownRecordSIDs; @@ -213,24 +244,14 @@ public final class RecordFactory { return new Record[] { record, }; } - private static Record createSingleRecord(RecordInputStream in) { - Constructor constructor = recordsMap.get(new Short(in.getSid())); + static Record createSingleRecord(RecordInputStream in) { + I_RecordCreator constructor = recordsMap.get(new Short(in.getSid())); if (constructor == null) { return new UnknownRecord(in); } - try { - return constructor.newInstance(new Object[] { in }); - } catch (InvocationTargetException e) { - throw new RecordFormatException("Unable to construct record instance" , e.getTargetException()); - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); - } catch (InstantiationException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } + return constructor.create(in); } /** @@ -290,8 +311,8 @@ public final class RecordFactory { * @return map of SIDs to short,short,byte[] constructors for Record classes * most of org.apache.poi.hssf.record.* */ - private static Map> recordsToMap(Class [] records) { - Map> result = new HashMap>(); + private static Map recordsToMap(Class [] records) { + Map result = new HashMap(); Set> uniqueRecClasses = new HashSet>(records.length * 3 / 2); for (int i = 0; i < records.length; i++) { @@ -318,11 +339,11 @@ public final class RecordFactory { } Short key = new Short(sid); if (result.containsKey(key)) { - Class prev = result.get(key).getDeclaringClass(); + String prevClassName = result.get(key).getRecordClassName(); throw new RuntimeException("duplicate record sid 0x" + Integer.toHexString(sid).toUpperCase() - + " for classes (" + recClass.getName() + ") and (" + prev.getName() + ")"); + + " for classes (" + recClass.getName() + ") and (" + prevClassName + ")"); } - result.put(key, constructor); + result.put(key, new ReflectionRecordCreator(constructor)); } return result; }