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 2008/10/28 14:21:09 UTC

svn commit: r708566 - in /labs/magma/trunk/foundation-i18n/src: main/java/org/apache/magma/i18n/complete/ test/java/org/apache/magma/i18n/

Author: simoneg
Date: Tue Oct 28 06:21:09 2008
New Revision: 708566

URL: http://svn.apache.org/viewvc?rev=708566&view=rev
Log:
LABS-191 : complete formatting on objects returned by a bean with formatting properties

Added:
    labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/
    labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/CompleteI18n.aj
    labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/WeakIdentityHashMap.java
Modified:
    labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/FormatOnBeanTest.java

Added: labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/CompleteI18n.aj
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/CompleteI18n.aj?rev=708566&view=auto
==============================================================================
--- labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/CompleteI18n.aj (added)
+++ labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/CompleteI18n.aj Tue Oct 28 06:21:09 2008
@@ -0,0 +1,32 @@
+package org.apache.magma.i18n.complete;
+
+import org.apache.magma.beans.MagmaBeanSupport;
+import org.apache.magma.beans.PropertyInfo;
+import org.apache.magma.i18n.Formatter;
+import org.aspectj.lang.reflect.MethodSignature;
+
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+public aspect CompleteI18n {
+
+	private WeakIdentityHashMap<Object, Formatter> format = new WeakIdentityHashMap<Object, Formatter>();
+	
+	pointcut beanGetter(MagmaBeanSupport bean) : execution(* *.get*()) && this(bean);
+	
+	after(MagmaBeanSupport bean) returning (Object ret) : beanGetter(bean) {
+		PropertyInfo property = bean.beanData().findProperty(((MethodSignature)thisJoinPointStaticPart.getSignature()).getMethod());
+		if (property == null) return;
+		Formatter formatter = property.getFormatter();
+		if (formatter != null) {
+			format.put(ret, formatter);
+		}
+	}
+	
+	String around(Object obj) : call(String *.toString()) && target(obj) {
+		Formatter formatter = format.get(obj);
+		if (formatter == null) return proceed(obj);
+		return formatter.toString(obj);
+	}
+	
+}

Added: labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/WeakIdentityHashMap.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/WeakIdentityHashMap.java?rev=708566&view=auto
==============================================================================
--- labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/WeakIdentityHashMap.java (added)
+++ labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/complete/WeakIdentityHashMap.java Tue Oct 28 06:21:09 2008
@@ -0,0 +1,173 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.magma.i18n.complete;
+
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * Implements a combination of WeakHashMap and IdentityHashMap.
+ * Useful for caches that need to key off of a == comparison
+ * instead of a .equals.
+ * 
+ * <b>
+ * This class is not a general-purpose Map implementation! While
+ * this class implements the Map interface, it intentionally violates
+ * Map's general contract, which mandates the use of the equals method
+ * when comparing objects. This class is designed for use only in the
+ * rare cases wherein reference-equality semantics are required.
+ * 
+ * Note that this implementation is not synchronized.
+ * </b>
+ * <i>Courtesy of the Apache CXF project</i>
+ */
+public class WeakIdentityHashMap<K, V> implements Map<K, V> {
+    private final ReferenceQueue<K> queue = new ReferenceQueue<K>();
+    private Map<IdentityWeakReference, V> backingStore = new HashMap<IdentityWeakReference, V>();
+
+
+    public WeakIdentityHashMap() {
+    }
+
+
+    public void clear() {
+        backingStore.clear();
+        reap();
+    }
+
+    public boolean containsKey(Object key) {
+        reap();
+        return backingStore.containsKey(new IdentityWeakReference(key));
+    }
+
+    public boolean containsValue(Object value)  {
+        reap();
+        return backingStore.containsValue(value);
+    }
+
+    public Set<Map.Entry<K, V>> entrySet() {
+        reap();
+        Set<Map.Entry<K, V>> ret = new HashSet<Map.Entry<K, V>>();
+        for (Map.Entry<IdentityWeakReference, V> ref : backingStore.entrySet()) {
+            final K key = ref.getKey().get();
+            final V value = ref.getValue();
+            Map.Entry<K, V> entry = new Map.Entry<K, V>() {
+                public K getKey() {
+                    return key;
+                }
+                public V getValue() {
+                    return value;
+                }
+                public V setValue(V value) {
+                    throw new UnsupportedOperationException();
+                }
+            };
+            ret.add(entry);
+        }
+        return Collections.unmodifiableSet(ret);
+    }
+    public Set<K> keySet() {
+        reap();
+        Set<K> ret = new HashSet<K>();
+        for (IdentityWeakReference ref : backingStore.keySet()) {
+            ret.add(ref.get());
+        }
+        return Collections.unmodifiableSet(ret);
+    }
+
+    public boolean equals(Object o) {
+        return backingStore.equals(((WeakIdentityHashMap)o).backingStore);
+    }
+
+    public V get(Object key) {
+        reap();
+        return backingStore.get(new IdentityWeakReference(key));
+    }
+    public V put(K key, V value) {
+        reap();
+        return backingStore.put(new IdentityWeakReference(key), value);
+    }
+
+    public int hashCode() {
+        reap();
+        return backingStore.hashCode();
+    }
+    public boolean isEmpty() {
+        reap();
+        return backingStore.isEmpty();
+    }
+    public void putAll(Map t) {
+        throw new UnsupportedOperationException();
+    }
+    public V remove(Object key) {
+        reap();
+        return backingStore.remove(new IdentityWeakReference(key));
+    }
+    public int size() {
+        reap();
+        return backingStore.size();
+    }
+    public Collection<V> values() {
+        reap();
+        return backingStore.values();
+    }
+
+    private synchronized void reap() {
+        Object zombie = queue.poll();
+
+        while (zombie != null) {
+            IdentityWeakReference victim = (IdentityWeakReference)zombie;
+            backingStore.remove(victim);
+            zombie = queue.poll();
+        }
+    }
+
+    class IdentityWeakReference extends WeakReference<K> {
+        int hash;
+        
+        @SuppressWarnings("unchecked")
+        IdentityWeakReference(Object obj) {
+            super((K)obj, queue);
+            hash = System.identityHashCode(obj);
+        }
+
+        public int hashCode() {
+            return hash;
+        }
+
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            IdentityWeakReference ref = (IdentityWeakReference)o;
+            if (this.get() == ref.get()) {
+                return true;
+            }
+            return false;
+        }
+    }
+}
+

Modified: labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/FormatOnBeanTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/FormatOnBeanTest.java?rev=708566&r1=708565&r2=708566&view=diff
==============================================================================
--- labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/FormatOnBeanTest.java (original)
+++ labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/FormatOnBeanTest.java Tue Oct 28 06:21:09 2008
@@ -1,6 +1,7 @@
 package org.apache.magma.i18n;
 
 import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.Locale;
 
 import org.apache.magma.beans.BeanData;
@@ -59,4 +60,15 @@
 		assertEquals(16, pi.getFormatter().getMaximumStringSize());
 		assertEquals(16, pi.getMaximumStringSize());
 	}
+	
+	@Test
+	public void completeFormatting() throws Exception {
+		ExplicitlyFormattedBean b = new ExplicitlyFormattedBean();
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		b.setBirthday(sdf.parse("1979-03-05"));
+		Date birthday = b.getBirthday();
+		CurrentLocale.setLocale(Locale.ITALIAN);
+		String val = birthday.toString();
+		assertEquals("00:00 05/03/1979", val);		
+	}
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org