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