You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by th...@apache.org on 2014/12/06 23:30:22 UTC
[11/15] tapestry-5 git commit: Fourth pass creating the BeanModel and
Commons packages.
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/eb7ec86e/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
index 8f1f7b6..a5f55b7 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
@@ -17,7 +17,6 @@ package org.apache.tapestry5.ioc.internal.util;
import org.apache.tapestry5.func.F;
import org.apache.tapestry5.func.Mapper;
import org.apache.tapestry5.func.Predicate;
-import org.apache.tapestry5.internal.InternalBeanModelUtils;
import org.apache.tapestry5.internal.plastic.PlasticInternalUtils;
import org.apache.tapestry5.ioc.*;
import org.apache.tapestry5.ioc.annotations.*;
@@ -80,11 +79,10 @@ public class InternalUtils
*
* @param method
* @return short string representation
- * @deprecated use {@link InternalStringUtils#asString(Method)} instead.
*/
public static String asString(Method method)
{
- return InternalStringUtils.asString(method);
+ return InternalCommonsUtils.asString(method);
}
/**
@@ -103,11 +101,10 @@ public class InternalUtils
/**
* Strips leading "_" and "$" and trailing "_" from the name.
- * @deprecated use {@link InternalStringUtils#stripMemberName(String)} instead.
*/
public static String stripMemberName(String memberName)
{
- return InternalStringUtils.stripMemberName(memberName);
+ return InternalCommonsUtils.stripMemberName(memberName);
}
/**
@@ -392,11 +389,10 @@ public class InternalUtils
/**
* Joins together some number of elements to form a comma separated list.
- * @deprecated use {@link InternalStringUtils#join(List)} instead.
*/
public static String join(List elements)
{
- return InternalStringUtils.join(elements);
+ return InternalCommonsUtils.join(elements);
}
/**
@@ -407,11 +403,10 @@ public class InternalUtils
* objects to be joined together
* @param separator
* used between elements when joining
- * @deprecated use {@link InternalStringUtils#asString(Method, String)} instead.
*/
public static String join(List elements, String separator)
{
- return InternalStringUtils.join(elements, separator);
+ return InternalCommonsUtils.join(elements, separator);
}
/**
@@ -419,21 +414,19 @@ public class InternalUtils
*
* @return the elements converted to strings, sorted, joined with comma ... or "(none)" if the elements are null or
* empty
- * @deprecated use {@link InternalStringUtils#joinSorted(Collection)} instead.
*/
public static String joinSorted(Collection elements)
{
- return InternalStringUtils.joinSorted(elements);
+ return InternalCommonsUtils.joinSorted(elements);
}
/**
* Returns true if the input is null, or is a zero length string (excluding leading/trailing whitespace).
- * @deprecated use {@link InternalStringUtils#isBlank(String)} instead.
*/
public static boolean isBlank(String input)
{
- return InternalStringUtils.isBlank(input);
+ return InternalCommonsUtils.isBlank(input);
}
/**
@@ -450,63 +443,27 @@ public class InternalUtils
return false;
}
- /**
- * @deprecated use {@link InternalStringUtils#isNonBlank(String)} instead.
- */
public static boolean isNonBlank(String input)
{
- return InternalStringUtils.isNonBlank(input);
+ return InternalCommonsUtils.isNonBlank(input);
}
/**
* Capitalizes a string, converting the first character to uppercase.
- * @deprecated use {@link InternalStringUtils#capitalize(String)} instead.
*/
public static String capitalize(String input)
{
- return InternalStringUtils.capitalize(input);
+ return InternalCommonsUtils.capitalize(input);
}
/**
* Sniffs the object to see if it is a {@link Location} or {@link Locatable}. Returns null if null or not
* convertable to a location.
*/
-
+
public static Location locationOf(Object location)
{
- if (location == null)
- return null;
-
- if (location instanceof Location)
- return (Location) location;
-
- if (location instanceof Locatable)
- return ((Locatable) location).getLocation();
-
- return null;
- }
-
- /**
- * Extracts the string keys from a map and returns them in sorted order. The keys are converted to strings.
- *
- * @param map
- * the map to extract keys from (may be null)
- * @return the sorted keys, or the empty set if map is null
- */
-
- public static List<String> sortedKeys(Map map)
- {
- if (map == null)
- return Collections.emptyList();
-
- List<String> keys = CollectionFactory.newList();
-
- for (Object o : map.keySet())
- keys.add(String.valueOf(o));
-
- Collections.sort(keys);
-
- return keys;
+ return InternalCommonsUtils.locationOf(location);
}
public static <K, V> Set<K> keys(Map<K, V> map)
@@ -572,11 +529,10 @@ public class InternalUtils
/**
* Return true if the input string contains the marker for symbols that must be expanded.
- * @deprecated use {@link InternalStringUtils#containsSymbols(String)} instead.
*/
public static boolean containsSymbols(String input)
{
- return InternalStringUtils.containsSymbols(input);
+ return InternalCommonsUtils.containsSymbols(input);
}
/**
@@ -584,11 +540,10 @@ public class InternalUtils
* generally a fully qualified class name, though tapestry-core also uses this method for the occasional property
* expression (which is also dot separated). Returns the input string unchanged if it does not contain a period
* character.
- * @deprecated use {@link InternalStringUtils#lastTerm(String)} instead.
*/
public static String lastTerm(String input)
{
- return InternalStringUtils.lastTerm(input);
+ return InternalCommonsUtils.lastTerm(input);
}
/**
@@ -684,15 +639,7 @@ public class InternalUtils
*/
public static <K, V> void addToMapList(Map<K, List<V>> map, K key, V value)
{
- List<V> list = map.get(key);
-
- if (list == null)
- {
- list = CollectionFactory.newList();
- map.put(key, list);
- }
-
- list.add(value);
+ InternalCommonsUtils.addToMapList(map, key, value);
}
/**
@@ -777,7 +724,7 @@ public class InternalUtils
*/
public static AnnotationProvider toAnnotationProvider(final Class element)
{
- return InternalBeanModelUtils.toAnnotationProvider(element);
+ return InternalCommonsUtils.toAnnotationProvider(element);
}
/**
@@ -1392,7 +1339,7 @@ public class InternalUtils
{
String value = namedAnnotation.value();
- if (InternalUtils.isNonBlank(value))
+ if (InternalCommonsUtils.isNonBlank(value))
{
return value;
}
@@ -1404,7 +1351,7 @@ public class InternalUtils
public static AnnotationProvider toAnnotationProvider(final Method element)
{
- return InternalBeanModelUtils.toAnnotationProvider(element);
+ return InternalCommonsUtils.toAnnotationProvider(element);
}
public static <T> ObjectCreator<T> createConstructorConstructionPlan(final OperationTracker tracker, final ObjectLocator locator,
@@ -1567,7 +1514,7 @@ public class InternalUtils
@Override
public void run()
{
- final ObjectCreator[] parameters = InternalUtils.calculateParametersForMethod(method, locator,
+ final ObjectCreator[] parameters = calculateParametersForMethod(method, locator,
resources, tracker);
plan.add(new InitializationPlan<Object>()
@@ -1651,4 +1598,55 @@ public class InternalUtils
{
return F.flow(creators).map(CREATE_OBJECT).toArray(Object.class);
}
+
+ /**
+ * Extracts the string keys from a map and returns them in sorted order. The keys are converted to strings.
+ *
+ * @param map
+ * the map to extract keys from (may be null)
+ * @return the sorted keys, or the empty set if map is null
+ */
+
+ public static List<String> sortedKeys(Map map)
+ {
+ return InternalCommonsUtils.sortedKeys(map);
+ }
+
+ /**
+ * Capitalizes the string, and inserts a space before each upper case character (or sequence of upper case
+ * characters). Thus "userId" becomes "User Id", etc. Also, converts underscore into space (and capitalizes the
+ * following word), thus "user_id" also becomes "User Id".
+ */
+ public static String toUserPresentable(String id)
+ {
+ return InternalCommonsUtils.toUserPresentable(id);
+ }
+
+ /**
+ * Used to convert a property expression into a key that can be used to locate various resources (Blocks, messages,
+ * etc.). Strips out any punctuation characters, leaving just words characters (letters, number and the
+ * underscore).
+ *
+ * @param expression a property expression
+ * @return the expression with punctuation removed
+ */
+ public static String extractIdFromPropertyExpression(String expression)
+ {
+ return InternalCommonsUtils.extractIdFromPropertyExpression(expression);
+ }
+
+ /**
+ * Looks for a label within the messages based on the id. If found, it is used, otherwise the name is converted to a
+ * user presentable form.
+ */
+ public static String defaultLabel(String id, Messages messages, String propertyExpression)
+ {
+ return InternalCommonsUtils.defaultLabel(id, messages, propertyExpression);
+ }
+
+ public static String replace(String input, Pattern pattern, String replacement)
+ {
+ return InternalCommonsUtils.replace(input, pattern, replacement);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/eb7ec86e/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/LockSupport.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/LockSupport.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/LockSupport.java
deleted file mode 100644
index 41de363..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/LockSupport.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2012 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.tapestry5.ioc.internal.util;
-
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-/**
- * Base class for classes that need to manage a ReadWriteLock.
- */
-public abstract class LockSupport
-{
- private final Lock readLock, writeLock;
-
- protected LockSupport()
- {
- ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
-
- readLock = lock.readLock();
- writeLock = lock.writeLock();
- }
-
- /**
- * Locks the shared read lock. Any number of threads may lock the read lock at the same time.
- */
- protected final void acquireReadLock()
- {
- readLock.lock();
- }
-
- /**
- * Takes the exclusive write lock. Once started, no other thread lock the read or write lock. When this method returns,
- * this thread will have locked the write lock and no other thread will have either the read or write lock.
- * Note that this thread must first drop the read lock (if it has it) before attempting to take the write lock, or this method will block forever.
- */
- protected final void takeWriteLock()
- {
- writeLock.lock();
- }
-
- /**
- * Releases the shared read lock.
- */
- protected final void releaseReadLock()
- {
- readLock.unlock();
- }
-
- /**
- * Releases the exclusive read lock.
- */
- protected final void releaseWriteLock()
- {
- writeLock.unlock();
- }
-
- /**
- * Releases the read lock, then takes the write lock. There's a short window where the thread will have neither lock:
- * during that window, some other thread may have a chance to take the write lock. In code, you'll often see a second check
- * inside the code that has the write lock to see if the update to perform is still necessary.
- */
- protected final void upgradeReadLockToWriteLock()
- {
- releaseReadLock();
- // This is that instant where another thread may grab the write lock. Very rare, but possible.
- takeWriteLock();
- }
-
- /**
- * Takes the read lock then releases the write lock.
- */
- protected final void downgradeWriteLockToReadLock()
- {
- acquireReadLock();
- releaseWriteLock();
- }
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/eb7ec86e/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/MessageFormatterImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/MessageFormatterImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/MessageFormatterImpl.java
deleted file mode 100644
index f4d8949..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/MessageFormatterImpl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2006-2013 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.tapestry5.ioc.internal.util;
-
-import org.apache.tapestry5.ioc.MessageFormatter;
-import org.apache.tapestry5.ioc.util.ExceptionUtils;
-
-import java.util.Locale;
-
-
-public class MessageFormatterImpl implements MessageFormatter
-{
- private final String format;
-
- private final Locale locale;
-
- public MessageFormatterImpl(String format, Locale locale)
- {
- this.format = format;
- this.locale = locale;
- }
-
- @Override
- public String format(Object... args)
- {
- for (int i = 0; i < args.length; i++)
- {
- Object arg = args[i];
-
- if (Throwable.class.isInstance(arg))
- {
- args[i] = ExceptionUtils.toMessage((Throwable) arg);
- }
- }
-
- // Might be tempting to create a Formatter object and just keep reusing it ... but
- // Formatters are not threadsafe.
-
- return String.format(locale, format, args);
- }
-
- /**
- * Returns the underlying format string for this formatter.
- *
- * @since 5.4
- */
- @Override
- public String toString()
- {
- return format;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/eb7ec86e/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/MessagesImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/MessagesImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/MessagesImpl.java
deleted file mode 100644
index c06ef90..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/MessagesImpl.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2006, 2012 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.tapestry5.ioc.internal.util;
-
-import org.apache.tapestry5.ioc.Messages;
-import org.apache.tapestry5.ioc.util.AbstractMessages;
-
-import java.util.*;
-
-/**
- * Implementation of {@link org.apache.tapestry5.ioc.Messages} based around a {@link java.util.ResourceBundle}.
- */
-public class MessagesImpl extends AbstractMessages
-{
- private final Map<String, String> properties = CollectionFactory.newCaseInsensitiveMap();
-
- /**
- * Finds the messages for a given Messages utility class. Strings the trailing "Messages" and replaces it with
- * "Strings" to form the base path. Loads the bundle using the default locale, and the class' class loader.
- *
- * @param forClass
- * @return Messages for the class
- */
- public static Messages forClass(Class forClass)
- {
- String className = forClass.getName();
- String stringsClassName = className.replaceAll("Messages$", "Strings");
-
- Locale locale = Locale.getDefault();
-
- ResourceBundle bundle = ResourceBundle.getBundle(stringsClassName, locale, forClass.getClassLoader());
-
- return new MessagesImpl(locale, bundle);
- }
-
- public MessagesImpl(Locale locale, ResourceBundle bundle)
- {
- super(locale);
-
- // Our best (threadsafe) chance to determine all the available keys.
- Enumeration<String> e = bundle.getKeys();
- while (e.hasMoreElements())
- {
- String key = e.nextElement();
- String value = bundle.getString(key);
-
- properties.put(key, value);
- }
- }
-
- @Override
- protected String valueForKey(String key)
- {
- return properties.get(key);
- }
-
- @Override
- public Set<String> getKeys()
- {
- return properties.keySet();
- }
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/eb7ec86e/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
index a9af358..6d13d66 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
@@ -17,6 +17,7 @@ package org.apache.tapestry5.ioc.modules;
import org.apache.tapestry5.func.Flow;
import org.apache.tapestry5.ioc.*;
import org.apache.tapestry5.ioc.annotations.*;
+import org.apache.tapestry5.ioc.internal.BasicTypeCoercions;
import org.apache.tapestry5.ioc.internal.services.*;
import org.apache.tapestry5.ioc.internal.services.cron.PeriodicExecutorImpl;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
@@ -189,301 +190,9 @@ public final class TapestryIOCModule
@Contribute(TypeCoercer.class)
public static void provideBasicTypeCoercions(Configuration<CoercionTuple> configuration)
{
- add(configuration, Object.class, String.class, new Coercion<Object, String>()
- {
- @Override
- public String coerce(Object input)
- {
- return input.toString();
- }
- });
-
- add(configuration, Object.class, Boolean.class, new Coercion<Object, Boolean>()
- {
- @Override
- public Boolean coerce(Object input)
- {
- return input != null;
- }
- });
-
- add(configuration, String.class, Double.class, new Coercion<String, Double>()
- {
- @Override
- public Double coerce(String input)
- {
- return new Double(input);
- }
- });
-
- // String to BigDecimal is important, as String->Double->BigDecimal would lose
- // precision.
-
- add(configuration, String.class, BigDecimal.class, new Coercion<String, BigDecimal>()
- {
- @Override
- public BigDecimal coerce(String input)
- {
- return new BigDecimal(input);
- }
- });
-
- add(configuration, BigDecimal.class, Double.class, new Coercion<BigDecimal, Double>()
- {
- @Override
- public Double coerce(BigDecimal input)
- {
- return input.doubleValue();
- }
- });
-
- add(configuration, String.class, BigInteger.class, new Coercion<String, BigInteger>()
- {
- @Override
- public BigInteger coerce(String input)
- {
- return new BigInteger(input);
- }
- });
-
- add(configuration, String.class, Long.class, new Coercion<String, Long>()
- {
- @Override
- public Long coerce(String input)
- {
- return new Long(input);
- }
- });
-
- add(configuration, Long.class, Byte.class, new Coercion<Long, Byte>()
- {
- @Override
- public Byte coerce(Long input)
- {
- return input.byteValue();
- }
- });
-
- add(configuration, Long.class, Short.class, new Coercion<Long, Short>()
- {
- @Override
- public Short coerce(Long input)
- {
- return input.shortValue();
- }
- });
-
- add(configuration, Long.class, Integer.class, new Coercion<Long, Integer>()
- {
- @Override
- public Integer coerce(Long input)
- {
- return input.intValue();
- }
- });
-
- add(configuration, Number.class, Long.class, new Coercion<Number, Long>()
- {
- @Override
- public Long coerce(Number input)
- {
- return input.longValue();
- }
- });
-
- add(configuration, Double.class, Float.class, new Coercion<Double, Float>()
- {
- @Override
- public Float coerce(Double input)
- {
- return input.floatValue();
- }
- });
-
- add(configuration, Long.class, Double.class, new Coercion<Long, Double>()
- {
- @Override
- public Double coerce(Long input)
- {
- return input.doubleValue();
- }
- });
-
- add(configuration, String.class, Boolean.class, new Coercion<String, Boolean>()
- {
- @Override
- public Boolean coerce(String input)
- {
- String trimmed = input == null ? "" : input.trim();
-
- if (trimmed.equalsIgnoreCase("false") || trimmed.length() == 0)
- return false;
-
- // Any non-blank string but "false"
-
- return true;
- }
- });
-
- add(configuration, Number.class, Boolean.class, new Coercion<Number, Boolean>()
- {
- @Override
- public Boolean coerce(Number input)
- {
- return input.longValue() != 0;
- }
- });
-
- add(configuration, Void.class, Boolean.class, new Coercion<Void, Boolean>()
- {
- @Override
- public Boolean coerce(Void input)
- {
- return false;
- }
- });
-
- add(configuration, Collection.class, Boolean.class, new Coercion<Collection, Boolean>()
- {
- @Override
- public Boolean coerce(Collection input)
- {
- return !input.isEmpty();
- }
- });
-
- add(configuration, Object.class, List.class, new Coercion<Object, List>()
- {
- @Override
- public List coerce(Object input)
- {
- return Collections.singletonList(input);
- }
- });
-
- add(configuration, Object[].class, List.class, new Coercion<Object[], List>()
- {
- @Override
- public List coerce(Object[] input)
- {
- return Arrays.asList(input);
- }
- });
-
- add(configuration, Object[].class, Boolean.class, new Coercion<Object[], Boolean>()
- {
- @Override
- public Boolean coerce(Object[] input)
- {
- return input != null && input.length > 0;
- }
- });
-
- add(configuration, Float.class, Double.class, new Coercion<Float, Double>()
- {
- @Override
- public Double coerce(Float input)
- {
- return input.doubleValue();
- }
- });
-
- Coercion primitiveArrayCoercion = new Coercion<Object, List>()
- {
- @Override
- public List<Object> coerce(Object input)
- {
- int length = Array.getLength(input);
- Object[] array = new Object[length];
- for (int i = 0; i < length; i++)
- {
- array[i] = Array.get(input, i);
- }
- return Arrays.asList(array);
- }
- };
-
- add(configuration, byte[].class, List.class, primitiveArrayCoercion);
- add(configuration, short[].class, List.class, primitiveArrayCoercion);
- add(configuration, int[].class, List.class, primitiveArrayCoercion);
- add(configuration, long[].class, List.class, primitiveArrayCoercion);
- add(configuration, float[].class, List.class, primitiveArrayCoercion);
- add(configuration, double[].class, List.class, primitiveArrayCoercion);
- add(configuration, char[].class, List.class, primitiveArrayCoercion);
- add(configuration, boolean[].class, List.class, primitiveArrayCoercion);
-
- add(configuration, String.class, File.class, new Coercion<String, File>()
- {
- @Override
- public File coerce(String input)
- {
- return new File(input);
- }
- });
-
- add(configuration, String.class, TimeInterval.class, new Coercion<String, TimeInterval>()
- {
- @Override
- public TimeInterval coerce(String input)
- {
- return new TimeInterval(input);
- }
- });
-
- add(configuration, TimeInterval.class, Long.class, new Coercion<TimeInterval, Long>()
- {
- @Override
- public Long coerce(TimeInterval input)
- {
- return input.milliseconds();
- }
- });
-
- add(configuration, Object.class, Object[].class, new Coercion<Object, Object[]>()
- {
- @Override
- public Object[] coerce(Object input)
- {
- return new Object[]
- {input};
- }
- });
-
- add(configuration, Collection.class, Object[].class, new Coercion<Collection, Object[]>()
- {
- @Override
- public Object[] coerce(Collection input)
- {
- return input.toArray();
- }
- });
-
- add(configuration, Flow.class, List.class, new Coercion<Flow, List>()
- {
- @Override
- public List coerce(Flow input)
- {
- return input.toList();
- }
- });
-
- add(configuration, Flow.class, Boolean.class, new Coercion<Flow, Boolean>()
- {
- @Override
- public Boolean coerce(Flow input)
- {
- return !input.isEmpty();
- }
- });
-
+ BasicTypeCoercions.provideBasicTypeCoercions(configuration);
}
-
- private static <S, T> void add(Configuration<CoercionTuple> configuration, Class<S> sourceType,
- Class<T> targetType, Coercion<S, T> coercion)
- {
- configuration.add(CoercionTuple.create(sourceType, targetType, coercion));
- }
-
+
/**
* <dl>
* <dt>SystemProperties</dt>
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/eb7ec86e/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/AbstractMessages.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/AbstractMessages.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/AbstractMessages.java
deleted file mode 100644
index 590c337..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/AbstractMessages.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2006, 2009, 2011 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.tapestry5.ioc.util;
-
-import org.apache.tapestry5.ioc.MessageFormatter;
-import org.apache.tapestry5.ioc.Messages;
-import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
-import org.apache.tapestry5.ioc.internal.util.MessageFormatterImpl;
-
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * Abstract implementation of {@link Messages} that doesn't know where values come from (that information is supplied in
- * a subclass, via the {@link #valueForKey(String)} method).
- */
-public abstract class AbstractMessages implements Messages
-{
- /**
- * String key to MF instance.
- */
- private final Map<String, MessageFormatter> cache = CollectionFactory.newConcurrentMap();
-
- private final Locale locale;
-
- protected AbstractMessages(Locale locale)
- {
- this.locale = locale;
- }
-
- /**
- * Invoked to provide the value for a particular key. This may be invoked multiple times even for the same key. The
- * implementation should <em>ignore the case of the key</em>.
- *
- * @param key the key to obtain a value for (case insensitive)
- * @return the value for the key, or null if this instance can not provide the value
- */
- protected abstract String valueForKey(String key);
-
-
- @Override
- public boolean contains(String key)
- {
- return valueForKey(key) != null;
- }
-
- @Override
- public String get(String key)
- {
- if (contains(key)) return valueForKey(key);
-
- return String.format("[[missing key: %s]]", key);
- }
-
- @Override
- public MessageFormatter getFormatter(String key)
- {
- MessageFormatter result = cache.get(key);
-
- if (result == null)
- {
- result = buildMessageFormatter(key);
- cache.put(key, result);
- }
-
- return result;
- }
-
- private MessageFormatter buildMessageFormatter(String key)
- {
- String format = get(key);
-
- return new MessageFormatterImpl(format, locale);
- }
-
- @Override
- public String format(String key, Object... args)
- {
- return getFormatter(key).format(args);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/eb7ec86e/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/TimeInterval.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/TimeInterval.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/TimeInterval.java
deleted file mode 100644
index eaffe46..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/util/TimeInterval.java
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2007, 2008, 2010, 2011 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.tapestry5.ioc.util;
-
-import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
-import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Used to represent a period of time, specifically as a configuration value. This is often used to specify timeouts.
- * <p/>
- * TimePeriods are parsed from strings.
- * <p/>
- * The string specifys a number of terms. The values of all the terms are summed together to form the total time period.
- * Each term consists of a number followed by a unit. Units (from largest to smallest) are: <dl> <dt>y <dd>year <dt>d
- * <dd>day <dt>h <dd>hour <dt>m <dd>minute <dt>s <dd>second <dt>ms <dd>millisecond </dl> <p> Example: "2 h 30 m". By
- * convention, terms are specified largest to smallest. A term without a unit is assumed to be milliseconds. Units are
- * case insensitive ("h" or "H" are treated the same).
- */
-public class TimeInterval
-{
- private static final Map<String, Long> UNITS = CollectionFactory.newCaseInsensitiveMap();
-
- private static final long MILLISECOND = 1000l;
-
- static
- {
- UNITS.put("ms", 1l);
- UNITS.put("s", MILLISECOND);
- UNITS.put("m", 60 * MILLISECOND);
- UNITS.put("h", 60 * UNITS.get("m"));
- UNITS.put("d", 24 * UNITS.get("h"));
- UNITS.put("y", 365 * UNITS.get("d"));
- }
-
- /**
- * The unit keys, sorted in descending order.
- */
- private static final String[] UNIT_KEYS =
- { "y", "d", "h", "m", "s", "ms" };
-
- private static final Pattern PATTERN = Pattern.compile("\\s*(\\d+)\\s*([a-z]*)", Pattern.CASE_INSENSITIVE);
-
- private final long milliseconds;
-
- /**
- * Creates a TimeInterval for a string.
- *
- * @param input
- * the string specifying the amount of time in the period
- */
- public TimeInterval(String input)
- {
- this(parseMilliseconds(input));
- }
-
- public TimeInterval(long milliseconds)
- {
- this.milliseconds = milliseconds;
- }
-
- public long milliseconds()
- {
- return milliseconds;
- }
-
- public long seconds()
- {
- return milliseconds / MILLISECOND;
- }
-
- /**
- * Converts the milliseconds back into a string (compatible with {@link #TimeInterval(String)}).
- *
- * @since 5.2.0
- */
- public String toDescription()
- {
- StringBuilder builder = new StringBuilder();
-
- String sep = "";
-
- long remainder = milliseconds;
-
- for (String key : UNIT_KEYS)
- {
- if (remainder == 0)
- break;
-
- long value = UNITS.get(key);
-
- long units = remainder / value;
-
- if (units > 0)
- {
- builder.append(sep);
- builder.append(units);
- builder.append(key);
-
- sep = " ";
-
- remainder = remainder % value;
- }
- }
-
- return builder.toString();
- }
-
- static long parseMilliseconds(String input)
- {
- long milliseconds = 0l;
-
- Matcher matcher = PATTERN.matcher(input);
-
- matcher.useAnchoringBounds(true);
-
- // TODO: Notice non matching characters and reject input, including at end
-
- int lastMatchEnd = -1;
-
- while (matcher.find())
- {
- int start = matcher.start();
-
- if (lastMatchEnd + 1 < start)
- {
- String invalid = input.substring(lastMatchEnd + 1, start);
- throw new RuntimeException(String.format("Unexpected string '%s' (in time interval '%s').", invalid, input));
- }
-
- lastMatchEnd = matcher.end();
-
- long count = Long.parseLong(matcher.group(1));
- String units = matcher.group(2);
-
- if (units.length() == 0)
- {
- milliseconds += count;
- continue;
- }
-
- Long unitValue = UNITS.get(units);
-
- if (unitValue == null)
- throw new RuntimeException(String.format("Unknown time interval unit '%s' (in '%s'). Defined units: %s.", units, input, InternalUtils.joinSorted(UNITS.keySet())));
-
- milliseconds += count * unitValue;
- }
-
- if (lastMatchEnd + 1 < input.length())
- {
- String invalid = input.substring(lastMatchEnd + 1);
- throw new RuntimeException(String.format("Unexpected string '%s' (in time interval '%s').", invalid, input));
- }
-
- return milliseconds;
- }
-
- @Override
- public String toString()
- {
- return String.format("TimeInterval[%d ms]", milliseconds);
- }
-
- @Override
- public boolean equals(Object obj)
- {
- if (obj == null)
- return false;
-
- if (obj instanceof TimeInterval)
- {
- TimeInterval tp = (TimeInterval) obj;
-
- return milliseconds == tp.milliseconds;
- }
-
- return false;
- }
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/eb7ec86e/tapestry-ioc/src/main/java/org/apache/tapestry5/util/StringToEnumCoercion.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/util/StringToEnumCoercion.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/util/StringToEnumCoercion.java
deleted file mode 100644
index 77c9a8d..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/util/StringToEnumCoercion.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2007, 2008, 2010, 2011 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.tapestry5.util;
-
-import java.util.Map;
-
-import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
-import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.ioc.services.Coercion;
-import org.apache.tapestry5.ioc.util.AvailableValues;
-import org.apache.tapestry5.ioc.util.UnknownValueException;
-
-/**
- * A {@link org.apache.tapestry5.ioc.services.Coercion} for converting strings into an instance of a particular
- * enumerated type. The {@link Enum#name() name} is used as the key to identify the enum instance, in a case-insensitive
- * fashion.
- * <p>
- * Moved from tapestry-core to tapestry-ioc is release 5.3, but kept in same package for compatibility.
- *
- * @param <T>
- * the type of enumeration
- */
-public final class StringToEnumCoercion<T extends Enum> implements Coercion<String, T>
-{
- private final Class<T> enumClass;
-
- private final Map<String, T> stringToEnum = CollectionFactory.newCaseInsensitiveMap();
-
- public StringToEnumCoercion(Class<T> enumClass)
- {
- this(enumClass, enumClass.getEnumConstants());
- }
-
- public StringToEnumCoercion(Class<T> enumClass, T... values)
- {
- this.enumClass = enumClass;
-
- for (T value : values)
- stringToEnum.put(value.name(), value);
- }
-
- @Override
- public T coerce(String input)
- {
- if (InternalUtils.isBlank(input))
- return null;
-
- T result = stringToEnum.get(input);
-
- if (result == null)
- {
- String message = String.format("Input '%s' does not identify a value from enumerated type %s.", input,
- enumClass.getName());
-
- throw new UnknownValueException(message, new AvailableValues(enumClass.getName() + " enum constants",
- stringToEnum));
- }
-
- return result;
- }
-
- /**
- * Allows an alias value (alternate) string to reference a value.
- *
- * @since 5.2.2
- */
- public StringToEnumCoercion<T> addAlias(String alias, T value)
- {
- stringToEnum.put(alias, value);
-
- return this;
- }
-
- public static <T extends Enum> StringToEnumCoercion<T> create(Class<T> enumClass)
- {
- return new StringToEnumCoercion<T>(enumClass);
- }
-
-}