poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r754828 - /poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java
Date Mon, 16 Mar 2009 07:03:15 GMT
Author: josh
Date: Mon Mar 16 07:03:13 2009
New Revision: 754828

URL: http://svn.apache.org/viewvc?rev=754828&view=rev
Log:
Abstracted record construction

Modified:
    poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java?rev=754828&r1=754827&r2=754828&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java Mon Mar 16 07:03:13 2009
@@ -45,6 +45,37 @@
  */
 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<? extends Record> _c;
+		public ReflectionRecordCreator(Constructor<? extends Record> 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 @@
 	/**
 	 * cache of the recordsToMap();
 	 */
-	private static Map<Short, Constructor<? extends Record>> recordsMap  = recordsToMap(recordClasses);
+	private static Map<Short, I_RecordCreator> recordsMap  = recordsToMap(recordClasses);
 
 	private static short[] _allKnownRecordSIDs;
 	
@@ -213,24 +244,14 @@
 		return new Record[] { record, };
 	}
 	
-	private static Record createSingleRecord(RecordInputStream in) {
-		Constructor<? extends Record> 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 @@
 	 * @return map of SIDs to short,short,byte[] constructors for Record classes
 	 * most of org.apache.poi.hssf.record.*
 	 */
-	private static Map<Short, Constructor<? extends Record>> recordsToMap(Class<?
extends Record> [] records) {
-		Map<Short, Constructor<? extends Record>> result = new HashMap<Short, Constructor<?
extends Record>>();
+	private static Map<Short, I_RecordCreator> recordsToMap(Class<? extends Record>
[] records) {
+		Map<Short, I_RecordCreator> result = new HashMap<Short, I_RecordCreator>();
 		Set<Class<?>> uniqueRecClasses = new HashSet<Class<?>>(records.length
* 3 / 2);
 
 		for (int i = 0; i < records.length; i++) {
@@ -318,11 +339,11 @@
 			}
 			Short key = new Short(sid);
 			if (result.containsKey(key)) {
-				Class<? extends Record> 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;
 	}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message