]> source.dussan.org Git - poi.git/commitdiff
Quick bit of refactoring to save parsing the type and id twice
authorNick Burch <nick@apache.org>
Fri, 8 Jan 2010 13:49:09 +0000 (13:49 +0000)
committerNick Burch <nick@apache.org>
Fri, 8 Jan 2010 13:49:09 +0000 (13:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@897205 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hsmf/datatypes/ByteChunk.java
src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java
src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessageSubmissionChunk.java
src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java
src/scratchpad/src/org/apache/poi/hsmf/parsers/POIFSChunkParser.java
src/scratchpad/testcases/org/apache/poi/hsmf/datatypes/TestChunkData.java

index 166a5feef40e4b22a1a795def3cb3e6ef74f9d9c..06ff28cccc680712b46af6e5549d8ab0b7d1d5c0 100644 (file)
@@ -36,10 +36,9 @@ public class ByteChunk extends Chunk {
        /**
         * Creates a Byte Chunk.
         */
-       public ByteChunk(String entryName) {
-               super(entryName);
-       }
-       
+   public ByteChunk(String namePrefix, int chunkId, int type) {
+      super(namePrefix, chunkId, type);
+   }
        /**
         * Create a Byte Chunk, with the specified
         *  type.
index 9e6748ab1145dd29bcba1b47409fd4b7a3d28b8a..7fcb252c96b17444cae76072930b728824239901 100644 (file)
@@ -28,21 +28,13 @@ abstract public class Chunk {
        protected int type;
        protected String namePrefix;
        
-       protected Chunk(String entryName) {
-          int splitAt = entryName.lastIndexOf('_');
-          if(splitAt == -1 || splitAt > (entryName.length()-8)) {
-             throw new IllegalArgumentException("Invalid chunk name " + entryName);
-          }
-          
-          namePrefix = entryName.substring(0, splitAt+1);
-          String ids = entryName.substring(splitAt+1);
-          chunkId = Integer.parseInt(ids.substring(0, 4), 16);
-      type    = Integer.parseInt(ids.substring(4, 8), 16);
-       }
+   protected Chunk(String namePrefix, int chunkId, int type) {
+      this.namePrefix = namePrefix;
+      this.chunkId = chunkId;
+      this.type = type;
+   }
        protected Chunk(int chunkId, int type) {
-          namePrefix = DEFAULT_NAME_PREFIX;
-          this.chunkId = chunkId;
-          this.type = type;
+          this(DEFAULT_NAME_PREFIX, chunkId, type);
        }
 
        /**
index 01793aba59f5725a0a5f472e04bfa4a6f08c3115..7ca6fee3f6297c37efb221a4968c3ad214aba242 100644 (file)
@@ -44,8 +44,8 @@ public class MessageSubmissionChunk extends Chunk {
        /**
         * Creates a Byte Chunk.
         */
-       public MessageSubmissionChunk(String entryName) {
-               super(entryName);
+       public MessageSubmissionChunk(String namePrefix, int chunkId, int type) {
+               super(namePrefix, chunkId, type);
        }
        
        /**
index b1f859d04f9f8b0017ab78207846de134c6cb3ed..5dfe116294b4f2b2129bb1783c58dcf7dcabf418 100644 (file)
@@ -36,8 +36,8 @@ public class StringChunk extends Chunk {
        /**
         * Creates a String Chunk.
         */
-       public StringChunk(String entryName) {
-               super(entryName);
+       public StringChunk(String namePrefix, int chunkId, int type) {
+               super(namePrefix, chunkId, type);
        }
        
        /**
index 34a4d27d7e89cc94bc244e16a4ec334bef2385a4..3a38d1b3d04e0838da8df338400abe14cab5014d 100644 (file)
@@ -102,39 +102,47 @@ public final class POIFSChunkParser {
     * Creates a chunk, and gives it to its parent group 
     */
    protected static void process(DocumentNode entry, ChunkGroup grouping) {
-      if(entry.getName().length() < 9) {
+      String entryName = entry.getName();
+      
+      if(entryName.length() < 9) {
          // Name in the wrong format
          return;
       }
-      if(entry.getName().indexOf('_') == -1) {
+      if(entryName.indexOf('_') == -1) {
          // Name in the wrong format
          return;
       }
       
-      // See if we can get a type for it
-      String idType = entry.getName().substring(entry.getName().length()-8);
-      String idS = idType.substring(0, 4);
-      String typeS = idType.substring(4); 
+      // Split it into its parts
+      int splitAt = entryName.lastIndexOf('_');
+      if(splitAt == -1 || splitAt > (entryName.length()-8)) {
+         throw new IllegalArgumentException("Invalid chunk name " + entryName);
+      }
+      
+      // Now try to turn it into id + type
+      String namePrefix = entryName.substring(0, splitAt+1);
+      String ids = entryName.substring(splitAt+1);
       try {
-         int id = Integer.parseInt(idS, 16);
-         int type = Integer.parseInt(typeS, 16);
+         int chunkId = Integer.parseInt(ids.substring(0, 4), 16);
+         int type    = Integer.parseInt(ids.substring(4, 8), 16);
+         
          Chunk chunk = null;
          
          // Special cases based on the ID
-         switch(id) {
+         switch(chunkId) {
          case Chunks.SUBMISSION_ID_DATE:
-            chunk = new MessageSubmissionChunk(entry.getName());
+            chunk = new MessageSubmissionChunk(namePrefix, chunkId, type);
             break;
          default:
             // Nothing special about this ID
             // So, do the usual thing which is by type
             switch(type) {
             case Types.BINARY:
-               chunk = new ByteChunk(entry.getName());
+               chunk = new ByteChunk(namePrefix, chunkId, type);
                break;
             case Types.ASCII_STRING:
             case Types.UNICODE_STRING:
-               chunk = new StringChunk(entry.getName());
+               chunk = new StringChunk(namePrefix, chunkId, type);
                break;
             }
          }
index 39440d13b64c4abb949c6fe7e5122c399b0addee..4e2e9a7cdcdf60d23d94618d884abe4e76bb8095 100644 (file)
@@ -40,7 +40,7 @@ public final class TestChunkData extends TestCase {
                assertEquals(0x0200, chunk.getChunkId());
                assertEquals(0x001E, chunk.getType());
 
-      chunk = new StringChunk("__substg1.0_0200001E");
+      chunk = new StringChunk("__substg1.0_", 0x0200, 0x001E);
       assertEquals("__substg1.0_0200001E", chunk.getEntryName());
       assertEquals(0x0200, chunk.getChunkId());
       assertEquals(0x001E, chunk.getType());