commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ima...@apache.org
Subject svn commit: r475451 - in /jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime: MimeFileObject.java MimeFileSystem.java MimeLazyMap.java
Date Wed, 15 Nov 2006 22:02:04 GMT
Author: imario
Date: Wed Nov 15 14:02:03 2006
New Revision: 475451

URL: http://svn.apache.org/viewvc?view=rev&rev=475451
Log:
allow access to get/is methods of underlaying access through the attributes

Added:
    jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeLazyMap.java
  (with props)
Modified:
    jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileObject.java
    jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileSystem.java

Modified: jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileObject.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileObject.java?view=diff&rev=475451&r1=475450&r2=475451
==============================================================================
--- jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileObject.java
(original)
+++ jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileObject.java
Wed Nov 15 14:02:03 2006
@@ -28,7 +28,6 @@
 import org.apache.commons.vfs.util.FileObjectUtils;
 import org.apache.commons.vfs.util.SharedRandomContentInputStream;
 
-import javax.mail.Header;
 import javax.mail.Message;
 import javax.mail.MessagingException;
 import javax.mail.Multipart;
@@ -37,14 +36,12 @@
 import javax.mail.internet.MimeMultipart;
 import java.io.InputStream;
 import java.io.IOException;
-import java.io.StringReader;
 import java.io.ByteArrayInputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
-import java.util.TreeMap;
 
 /**
  * A part of a MIME message.
@@ -57,15 +54,15 @@
 	implements FileObject
 {
 	private Part part;
+	private Map attributeMap = Collections.EMPTY_MAP;
 
 	protected MimeFileObject(final FileName name,
 							final Part part,
 							final AbstractFileSystem fileSystem) throws FileSystemException
 	{
 		super(name, fileSystem);
-		this.part = part;
+		setPart(part);
 	}
-
 	/**
      * Attaches this file object to its file resource.
      */
@@ -76,7 +73,7 @@
 			if (!getName().equals(getFileSystem().getRootName()))
 			{
 				MimeFileObject foParent = (MimeFileObject) FileObjectUtils.getAbstractFileObject(getParent());
-				part = foParent.findPart(getName().getBaseName());
+				setPart(foParent.findPart(getName().getBaseName()));
 				return;
 			}
 
@@ -97,7 +94,7 @@
 				{
 					is = getFileSystem().getParentLayer().getContent().getInputStream();
 				}
-				part = new MimeMessage(null, is);
+				setPart(new MimeMessage(null, is));
 			}
 			finally
 			{
@@ -233,6 +230,14 @@
 	private void setPart(Part part)
 	{
 		this.part = part;
+		if (part != null)
+		{
+			attributeMap = new MimeLazyMap(part);
+		}
+		else
+		{
+			attributeMap = Collections.EMPTY_MAP;
+		}
 	}
 
 	/**
@@ -285,7 +290,7 @@
 			String preamble = ((MimeMultipart) part.getContent()).getPreamble();
 			return new ByteArrayInputStream(preamble.getBytes(MimeFileSystem.PREAMBLE_CHARSET));
 		}
-		
+
 		return part.getInputStream();
 	}
 
@@ -315,24 +320,28 @@
 	 */
 	protected Map doGetAttributes() throws Exception
 	{
+		return attributeMap;
+		/*
 		Map ret = new TreeMap();
 
-		Enumeration headers = getAllHeaders();
+		Enumeration headers = part.getAllHeaders();
 		while (headers.hasMoreElements())
 		{
 			Header header = (Header) headers.nextElement();
-			Object values = ret.get(header.getName());
+			String headerName = header.getName();
+
+			Object values = ret.get(headerName);
 
 			if (values == null)
 			{
-				ret.put(header.getName(), header.getValue());
+				ret.put(headerName, header.getValue());
 			}
 			else if (values instanceof String)
 			{
 				List newValues = new ArrayList();
 				newValues.add(values);
 				newValues.add(header.getValue());
-				ret.put(header.getName(), newValues);
+				ret.put(headerName, newValues);
 			}
 			else if (values instanceof List)
 			{
@@ -341,6 +350,7 @@
 		}
 
 		return ret;
+		*/
 	}
 
 	protected Enumeration getAllHeaders() throws MessagingException

Modified: jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileSystem.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileSystem.java?view=diff&rev=475451&r1=475450&r2=475451
==============================================================================
--- jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileSystem.java
(original)
+++ jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeFileSystem.java
Wed Nov 15 14:02:03 2006
@@ -22,7 +22,11 @@
 import org.apache.commons.vfs.FileSystemOptions;
 import org.apache.commons.vfs.provider.AbstractFileSystem;
 
+import javax.mail.internet.MimeMessage;
 import java.util.Collection;
+import java.util.Map;
+import java.util.TreeMap;
+import java.lang.reflect.Method;
 
 /**
  * An MIME file system.

Added: jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeLazyMap.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeLazyMap.java?view=auto&rev=475451
==============================================================================
--- jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeLazyMap.java
(added)
+++ jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeLazyMap.java
Wed Nov 15 14:02:03 2006
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2002-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.vfs.provider.mime;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.mail.Header;
+import javax.mail.MessagingException;
+import javax.mail.Part;
+import javax.mail.internet.MimeMessage;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.Iterator;
+import java.util.Collections;
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * A map which tries to avoid building the real content as long as possible.
+ * This makes quick lookups with known keys faster
+ */
+public class MimeLazyMap implements Map
+{
+	private Log log = LogFactory.getLog(MimeLazyMap.class);
+
+	private final static String OBJECT_PREFIX = "obj.";
+
+	private final Part part;
+	private Map backingMap;
+
+	private final static Map mimeMessageGetters = new TreeMap();
+
+	static
+	{
+		Method[] methods = MimeMessage.class.getMethods();
+		for (int i = 0; i<methods.length; i++)
+		{
+			Method method = methods[i];
+			addMimeMessageMethod(method);
+		}
+		methods = MimeMessage.class.getDeclaredMethods();
+		for (int i = 0; i<methods.length; i++)
+		{
+			Method method = methods[i];
+			addMimeMessageMethod(method);
+		}
+	}
+
+	private static void addMimeMessageMethod(Method method)
+	{
+		if (method.getName().startsWith("get"))
+		{
+			mimeMessageGetters.put(method.getName().substring(3), method);
+		}
+		else if (method.getName().startsWith("is"))
+		{
+			mimeMessageGetters.put(method.getName().substring(2), method);
+		}
+	}
+
+	public MimeLazyMap(Part part)
+	{
+		this.part = part;
+	}
+
+	private Map getMap()
+	{
+		if (backingMap == null)
+		{
+			backingMap = createMap();
+		}
+
+		return backingMap;
+	}
+
+	private Map createMap()
+	{
+		Map ret = new TreeMap();
+
+		Enumeration headers = null;
+		try
+		{
+			headers = part.getAllHeaders();
+		}
+		catch (MessagingException e)
+		{
+			throw (RuntimeException) new RuntimeException(e);
+		}
+		while (headers.hasMoreElements())
+		{
+			Header header = (Header) headers.nextElement();
+			String headerName = header.getName();
+
+			Object values = ret.get(headerName);
+
+			if (values == null)
+			{
+				ret.put(headerName, header.getValue());
+			}
+			else if (values instanceof String)
+			{
+				List newValues = new ArrayList();
+				newValues.add(values);
+				newValues.add(header.getValue());
+				ret.put(headerName, newValues);
+			}
+			else if (values instanceof List)
+			{
+				((List) values).add(header.getValue());
+			}
+		}
+
+		Iterator iterEntries = mimeMessageGetters.entrySet().iterator();
+		while (iterEntries.hasNext())
+		{
+			Map.Entry entry = (Map.Entry) iterEntries.next();
+			String name = (String) entry.getKey();
+			Method method = (Method) entry.getValue();
+
+			Object value;
+			try
+			{
+				value = method.invoke(part, null);
+			}
+			catch (IllegalAccessException e)
+			{
+				log.warn(e.getLocalizedMessage(), e);
+				continue;
+			}
+			catch (InvocationTargetException e)
+			{
+				log.warn(e.getLocalizedMessage(), e);
+				continue;
+			}
+
+			ret.put(OBJECT_PREFIX+name, value);
+		}
+
+		return ret;
+	}
+
+	public int size()
+	{
+		return getMap().size();
+	}
+
+	public boolean isEmpty()
+	{
+		return getMap().size() < 1;
+	}
+
+	public boolean containsKey(Object key)
+	{
+		return getMap().containsKey(key);
+	}
+
+	public boolean containsValue(Object value)
+	{
+		return getMap().containsValue(value);
+	}
+
+	public Object get(Object key)
+	{
+		if (backingMap != null)
+		{
+			return backingMap.get(key);
+		}
+
+		return null;
+	}
+
+	public Object put(Object key, Object value)
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public Object remove(Object key)
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public void putAll(Map t)
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public void clear()
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public Set keySet()
+	{
+		return Collections.unmodifiableSet(getMap().keySet());
+	}
+
+	public Collection values()
+	{
+		return Collections.unmodifiableCollection(getMap().values());
+	}
+
+	public Set entrySet()
+	{
+		return Collections.unmodifiableSet(getMap().entrySet());
+	}
+}

Propchange: jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeLazyMap.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeLazyMap.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/commons/proper/vfs/trunk/sandbox/src/main/java/org/apache/commons/vfs/provider/mime/MimeLazyMap.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message