Author: simoneg
Date: Fri Jan 29 04:20:46 2010
New Revision: 904376

URL: http://svn.apache.org/viewvc?rev=904376&view=rev
Log:
Shorter format for uploaded files

Modified:
    
labs/magma/trunk/beans-file/src/main/java/org/apache/magma/beans/MagFile.java
    
labs/magma/trunk/beans-file/src/test/java/org/apache/magma/beans/MagFileTest.java

Modified: 
labs/magma/trunk/beans-file/src/main/java/org/apache/magma/beans/MagFile.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-file/src/main/java/org/apache/magma/beans/MagFile.java?rev=904376&r1=904375&r2=904376&view=diff
==============================================================================
--- 
labs/magma/trunk/beans-file/src/main/java/org/apache/magma/beans/MagFile.java 
(original)
+++ 
labs/magma/trunk/beans-file/src/main/java/org/apache/magma/beans/MagFile.java 
Fri Jan 29 04:20:46 2010
@@ -6,6 +6,8 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.StringTokenizer;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.magma.basics.MagmaException;
 import org.apache.magma.settings.Settings;
@@ -13,6 +15,8 @@
 
 public class MagFile {
        
+       protected static AtomicLong progId = new 
AtomicLong(System.currentTimeMillis() / 1000);
+       
        protected String originalName;
        protected String mimeType;
        protected long length;
@@ -60,7 +64,45 @@
        public MagFile(String spec) {
                char fmt = spec.charAt(0);
                spec = spec.substring(1);
-               if (fmt == '1') {
+               if (fmt == '2') {
+                       StringTokenizer stok = new StringTokenizer(spec, "*/", 
true);
+                       // First one is always the source, and is mandatory
+                       this.source = stok.nextToken();
+                       if (stok.hasMoreTokens()) {
+                               String tok = stok.nextToken();
+                               // If it is already "/" then we have name and 
nothing else
+                               if (tok.equals("/")) {
+                                       this.originalName = stok.nextToken();
+                               } else {
+                                       // Otherwise it must be "*", so get the 
value after it
+                                       tok = stok.nextToken();
+                                       if (tok.startsWith("0")) {
+                                               // If it is "0" then it is not 
a mime type
+                                               this.length = 
Long.parseLong(tok, 32);
+                                       } else {
+                                               // Otherwise it is a mime type
+                                               this.mimeType = 
tok.replace('$', '/');
+                                       }
+                                       if (stok.hasMoreTokens()) {
+                                               // Next separator is "*" is 
after mime type there is length
+                                               tok = stok.nextToken();
+                                               if (tok.equals("/")) {
+                                                       this.originalName = 
stok.nextToken();                                           
+                                               } else {
+                                                       // We have a length, 
decode it
+                                                       tok = stok.nextToken();
+                                                       this.length = 
Long.parseLong(tok, 32);
+                                                       // We have more tokens, 
can be only the file name
+                                                       if 
(stok.hasMoreElements()) {
+                                                               if 
(stok.nextToken().equals("/")) {
+                                                                       
this.originalName = stok.nextToken();                                           
                                                                        
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               } else if (fmt == '1') {
                        int ios = spec.indexOf('/');
                        if (ios != -1) {
                                spec = spec.substring(0, ios);
@@ -137,8 +179,50 @@
        }
        
        
+       /**
+        * Current format is :
+        * <ul>
+        *      <li>"2" to identify format
+        *  <li>source, which is the handle code
+        *  <li>If there is a mime type or known length, an "*" follows.
+        *  <li>mime type if present, replacing "/" with "$". Otherwise "0"
+        *  <li>If there are both size and mime type, an "*" to separate them.
+        *  <li>size, a long string encoded base 32, if present
+        *  <li>if there is a name, "/" followed by the name
+        * </ul>
+        * This encodes the four informations (handle code, mime type, size, 
original name) in the lowest
+        * number of characters.
+        * 
+        * Replacing the "/"in the mime type makes it more URL friendly. While 
according to RFC4288 a mime type
+        * name can contain a "$" sign, there is no currently registered mime 
type with IANA that contains
+        * such a character.
+        * 
+        * @return
+        */
        public String getSpec() {
-               return "1" + this.source + "*" + this.originalName + "*" + 
this.mimeType + "*" + this.length;
+               StringBuilder f2 = new StringBuilder();
+               f2.append('2');
+               f2.append(this.source);
+               if (this.mimeType != null) {
+                       f2.append('*');
+                       f2.append(this.mimeType.replace('/', '$'));
+                       if (this.length != 0) {
+                               f2.append("*");
+                       }
+               } else if (this.length != 0) {
+                       f2.append('*');
+                       f2.append('0');
+               }
+               if (this.length != 0) {
+                       f2.append(Long.toString(this.length, 32));
+               }
+               if (this.originalName != null) {
+                       f2.append('/');
+                       f2.append(this.originalName);
+               }
+               // Old 1 format
+               //return "1" + this.source + "*" + this.originalName + "*" + 
this.mimeType + "*" + this.length;
+               return f2.toString();
        }
 
        public InputStream getInputStream() {
@@ -154,7 +238,8 @@
        public void persist() {
                if (!modified) return;
                if (source == null) {
-                       source = Long.toHexString(System.currentTimeMillis()) + 
Long.toHexString(System.nanoTime()); 
+                       long id = progId.incrementAndGet();
+                       source = Long.toString(id, 32); 
                }
                if (this.stream != null) {
                        try {

Modified: 
labs/magma/trunk/beans-file/src/test/java/org/apache/magma/beans/MagFileTest.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-file/src/test/java/org/apache/magma/beans/MagFileTest.java?rev=904376&r1=904375&r2=904376&view=diff
==============================================================================
--- 
labs/magma/trunk/beans-file/src/test/java/org/apache/magma/beans/MagFileTest.java
 (original)
+++ 
labs/magma/trunk/beans-file/src/test/java/org/apache/magma/beans/MagFileTest.java
 Fri Jan 29 04:20:46 2010
@@ -55,6 +55,63 @@
                
        }
        
+       @Test
+       public void specTest() throws Exception {
+               MagFile m1 = new MagFile();
+               MagFile m2 = null;
+               
+               m1.setSource("SRC");
+               m2 = new MagFile(m1.getSpec());
+               assertEquals("Wrong source encode/decode in " + m1.getSpec(), 
m1.getSource(), m2.getSource());
+               assertEquals("Wrong mime encode/decode in " + m1.getSpec(), 
m1.getMimeType(), m2.getMimeType());
+               assertEquals("Wrong length encode/decode in " + m1.getSpec(), 
m1.getLength(), m2.getLength());
+               assertEquals("Wrong name encode/decode in " + m1.getSpec(), 
m1.getOriginalName(), m2.getOriginalName());
+               
+               m1.setMimeType("text/plain");
+               m2 = new MagFile(m1.getSpec());
+               assertEquals("Wrong source encode/decode in " + m1.getSpec(), 
m1.getSource(), m2.getSource());
+               assertEquals("Wrong mime encode/decode in " + m1.getSpec(), 
m1.getMimeType(), m2.getMimeType());
+               assertEquals("Wrong length encode/decode in " + m1.getSpec(), 
m1.getLength(), m2.getLength());
+               assertEquals("Wrong name encode/decode in " + m1.getSpec(), 
m1.getOriginalName(), m2.getOriginalName());
+               
+               m1.setLength(500);
+               m2 = new MagFile(m1.getSpec());
+               assertEquals("Wrong source encode/decode in " + m1.getSpec(), 
m1.getSource(), m2.getSource());
+               assertEquals("Wrong mime encode/decode in " + m1.getSpec(), 
m1.getMimeType(), m2.getMimeType());
+               assertEquals("Wrong length encode/decode in " + m1.getSpec(), 
m1.getLength(), m2.getLength());
+               assertEquals("Wrong name encode/decode in " + m1.getSpec(), 
m1.getOriginalName(), m2.getOriginalName());
+               
+               m1.setOriginalName("myname.txt");
+               m2 = new MagFile(m1.getSpec());
+               assertEquals("Wrong source encode/decode in " + m1.getSpec(), 
m1.getSource(), m2.getSource());
+               assertEquals("Wrong mime encode/decode in " + m1.getSpec(), 
m1.getMimeType(), m2.getMimeType());
+               assertEquals("Wrong length encode/decode in " + m1.getSpec(), 
m1.getLength(), m2.getLength());
+               assertEquals("Wrong name encode/decode in " + m1.getSpec(), 
m1.getOriginalName(), m2.getOriginalName());
+               
+               m1.setLength(0);
+               m2 = new MagFile(m1.getSpec());
+               assertEquals("Wrong source encode/decode in " + m1.getSpec(), 
m1.getSource(), m2.getSource());
+               assertEquals("Wrong mime encode/decode in " + m1.getSpec(), 
m1.getMimeType(), m2.getMimeType());
+               assertEquals("Wrong length encode/decode in " + m1.getSpec(), 
m1.getLength(), m2.getLength());
+               assertEquals("Wrong name encode/decode in " + m1.getSpec(), 
m1.getOriginalName(), m2.getOriginalName());
+               
+               m1.setLength(500);
+               m1.setMimeType(null);
+               m2 = new MagFile(m1.getSpec());
+               assertEquals("Wrong source encode/decode in " + m1.getSpec(), 
m1.getSource(), m2.getSource());
+               assertEquals("Wrong mime encode/decode in " + m1.getSpec(), 
m1.getMimeType(), m2.getMimeType());
+               assertEquals("Wrong length encode/decode in " + m1.getSpec(), 
m1.getLength(), m2.getLength());
+               assertEquals("Wrong name encode/decode in " + m1.getSpec(), 
m1.getOriginalName(), m2.getOriginalName());
+               
+               m1.setLength(0);
+               m1.setMimeType(null);
+               m2 = new MagFile(m1.getSpec());
+               assertEquals("Wrong source encode/decode in " + m1.getSpec(), 
m1.getSource(), m2.getSource());
+               assertEquals("Wrong mime encode/decode in " + m1.getSpec(), 
m1.getMimeType(), m2.getMimeType());
+               assertEquals("Wrong length encode/decode in " + m1.getSpec(), 
m1.getLength(), m2.getLength());
+               assertEquals("Wrong name encode/decode in " + m1.getSpec(), 
m1.getOriginalName(), m2.getOriginalName());                
+       }
+       
        
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to