You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2010/01/29 05:20:46 UTC

svn commit: r904376 - in /labs/magma/trunk/beans-file/src: main/java/org/apache/magma/beans/MagFile.java test/java/org/apache/magma/beans/MagFileTest.java

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: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org