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