Third pass creating the BeanModel and Commons packages.
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/9f9e5699 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/9f9e5699 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/9f9e5699 Branch: refs/heads/beanmodel-split Commit: 9f9e5699961a880ef8d460fbd8efe9f53cd71b52 Parents: d54315f Author: Thiago H. de Paula Figueiredo <[email protected]> Authored: Sat Dec 6 17:33:54 2014 -0200 Committer: Thiago H. de Paula Figueiredo <[email protected]> Committed: Sat Dec 6 20:32:39 2014 -0200 ---------------------------------------------------------------------- .../tapestry5/internal/BeanModelUtils.java | 145 ------------ .../internal/InternalBeanModelUtils.java | 145 ++++++++++++ .../internal/beaneditor/BeanModelUtils.java | 120 ++++++++++ .../internal/beaneditor/PropertyModelImpl.java | 6 +- .../internal/services/BeanModelSourceImpl.java | 222 +++++++++++++++++++ .../services/PropertyConduitSourceImpl.java | 4 +- .../tapestry5/services/DataTypeAnalyzer.java | 48 ++++ .../internal/TapestryInternalUtils.java | 8 +- .../internal/beaneditor/BeanModelUtils.java | 119 ---------- .../internal/services/BeanModelSourceImpl.java | 222 ------------------- .../tapestry5/services/DataTypeAnalyzer.java | 48 ---- .../annotations/UsesMappedConfiguration.java | 41 ---- .../annotations/UsesOrderedConfiguration.java | 33 --- .../ioc/internal/util/InternalUtils.java | 6 +- .../annotations/UsesMappedConfiguration.java | 41 ++++ .../annotations/UsesOrderedConfiguration.java | 33 +++ 16 files changed, 621 insertions(+), 620 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/beanmodel/src/main/java/org/apache/tapestry5/internal/BeanModelUtils.java ---------------------------------------------------------------------- diff --git a/beanmodel/src/main/java/org/apache/tapestry5/internal/BeanModelUtils.java b/beanmodel/src/main/java/org/apache/tapestry5/internal/BeanModelUtils.java deleted file mode 100644 index 08cb88a..0000000 --- a/beanmodel/src/main/java/org/apache/tapestry5/internal/BeanModelUtils.java +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2007, 2008 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.internal; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.regex.Pattern; - -import org.apache.tapestry5.ioc.AnnotationProvider; -import org.apache.tapestry5.ioc.Messages; -import org.apache.tapestry5.ioc.internal.NullAnnotationProvider; -import org.apache.tapestry5.ioc.internal.util.InternalStringUtils; - -/** - * Some methods broken off tapestry-core's InternalUtils to avoid bringing the whole class - * plus its multiple dependencies to the BeanModel package. - */ -public class BeanModelUtils { - - public static final Pattern NON_WORD_PATTERN = Pattern.compile("[^\\w]"); - - /** - * @since 5.3 - */ - private final static AnnotationProvider NULL_ANNOTATION_PROVIDER = new NullAnnotationProvider(); - - - /** - * 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 replace(expression, NON_WORD_PATTERN, ""); - } - - public static String replace(String input, Pattern pattern, String replacement) - { - return pattern.matcher(input).replaceAll(replacement); - } - - /** - * 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) - { - String key = id + "-label"; - - if (messages.contains(key)) - return messages.get(key); - - return toUserPresentable(extractIdFromPropertyExpression(InternalStringUtils.lastTerm(propertyExpression))); - } - - /** - * 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) - { - StringBuilder builder = new StringBuilder(id.length() * 2); - - char[] chars = id.toCharArray(); - boolean postSpace = true; - boolean upcaseNext = true; - - for (char ch : chars) - { - if (upcaseNext) - { - builder.append(Character.toUpperCase(ch)); - upcaseNext = false; - - continue; - } - - if (ch == '_') - { - builder.append(' '); - upcaseNext = true; - continue; - } - - boolean upperCase = Character.isUpperCase(ch); - - if (upperCase && !postSpace) - builder.append(' '); - - builder.append(ch); - - postSpace = upperCase; - } - - return builder.toString(); - } - - /** - * @since 5.3 - */ - public static AnnotationProvider toAnnotationProvider(final Class element) - { - return new AnnotationProvider() - { - @Override - public <T extends Annotation> T getAnnotation(Class<T> annotationClass) - { - return annotationClass.cast(element.getAnnotation(annotationClass)); - } - }; - } - - public static AnnotationProvider toAnnotationProvider(final Method element) - { - if (element == null) - return NULL_ANNOTATION_PROVIDER; - - return new AnnotationProvider() - { - @Override - public <T extends Annotation> T getAnnotation(Class<T> annotationClass) - { - return element.getAnnotation(annotationClass); - } - }; - } - - -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/beanmodel/src/main/java/org/apache/tapestry5/internal/InternalBeanModelUtils.java ---------------------------------------------------------------------- diff --git a/beanmodel/src/main/java/org/apache/tapestry5/internal/InternalBeanModelUtils.java b/beanmodel/src/main/java/org/apache/tapestry5/internal/InternalBeanModelUtils.java new file mode 100644 index 0000000..88f4c7f --- /dev/null +++ b/beanmodel/src/main/java/org/apache/tapestry5/internal/InternalBeanModelUtils.java @@ -0,0 +1,145 @@ +// Copyright 2007, 2008 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.internal; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.regex.Pattern; + +import org.apache.tapestry5.ioc.AnnotationProvider; +import org.apache.tapestry5.ioc.Messages; +import org.apache.tapestry5.ioc.internal.NullAnnotationProvider; +import org.apache.tapestry5.ioc.internal.util.InternalStringUtils; + +/** + * Some methods broken off tapestry-core's InternalUtils to avoid bringing the whole class + * plus its multiple dependencies to the BeanModel package. + */ +public class InternalBeanModelUtils { + + public static final Pattern NON_WORD_PATTERN = Pattern.compile("[^\\w]"); + + /** + * @since 5.3 + */ + private final static AnnotationProvider NULL_ANNOTATION_PROVIDER = new NullAnnotationProvider(); + + + /** + * 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 replace(expression, NON_WORD_PATTERN, ""); + } + + public static String replace(String input, Pattern pattern, String replacement) + { + return pattern.matcher(input).replaceAll(replacement); + } + + /** + * 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) + { + String key = id + "-label"; + + if (messages.contains(key)) + return messages.get(key); + + return toUserPresentable(extractIdFromPropertyExpression(InternalStringUtils.lastTerm(propertyExpression))); + } + + /** + * 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) + { + StringBuilder builder = new StringBuilder(id.length() * 2); + + char[] chars = id.toCharArray(); + boolean postSpace = true; + boolean upcaseNext = true; + + for (char ch : chars) + { + if (upcaseNext) + { + builder.append(Character.toUpperCase(ch)); + upcaseNext = false; + + continue; + } + + if (ch == '_') + { + builder.append(' '); + upcaseNext = true; + continue; + } + + boolean upperCase = Character.isUpperCase(ch); + + if (upperCase && !postSpace) + builder.append(' '); + + builder.append(ch); + + postSpace = upperCase; + } + + return builder.toString(); + } + + /** + * @since 5.3 + */ + public static AnnotationProvider toAnnotationProvider(final Class element) + { + return new AnnotationProvider() + { + @Override + public <T extends Annotation> T getAnnotation(Class<T> annotationClass) + { + return annotationClass.cast(element.getAnnotation(annotationClass)); + } + }; + } + + public static AnnotationProvider toAnnotationProvider(final Method element) + { + if (element == null) + return NULL_ANNOTATION_PROVIDER; + + return new AnnotationProvider() + { + @Override + public <T extends Annotation> T getAnnotation(Class<T> annotationClass) + { + return element.getAnnotation(annotationClass); + } + }; + } + + +} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelUtils.java ---------------------------------------------------------------------- diff --git a/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelUtils.java b/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelUtils.java new file mode 100644 index 0000000..154ee79 --- /dev/null +++ b/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelUtils.java @@ -0,0 +1,120 @@ +// Copyright 2007, 2008, 2009, 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.internal.beaneditor; + +import org.apache.tapestry5.beaneditor.BeanModel; +import org.apache.tapestry5.ioc.internal.util.InternalStringUtils; + +/** + * Utilities used in a few places to modify an existing {@link BeanModel}. + */ +public final class BeanModelUtils +{ + + final private static String[] EMPTY_STRING_ARRAY = new String[0]; + + /** + * Performs standard set of modifications to a {@link org.apache.tapestry5.beaneditor.BeanModel} + * . First new + * properties may be added, then properties removed, then properties reordered. + * + * @param model to modifiy + * @param addPropertyNames comma seperated list of property names to add, or null + * @param includePropertyNames comma seperated list of property names to include + * @param excludePropertyNames comma seperated list of property names to exclude, or null + * @param reorderPropertyNames comma seperated list of property names to reorder, or null + */ + public static void modify(BeanModel model, String addPropertyNames, + String includePropertyNames, String excludePropertyNames, String reorderPropertyNames) + { + if (addPropertyNames != null) + add(model, addPropertyNames); + + if (includePropertyNames != null) + include(model, join(includePropertyNames, addPropertyNames)); + + if (excludePropertyNames != null) + exclude(model, excludePropertyNames); + + if (reorderPropertyNames != null) + reorder(model, reorderPropertyNames); + } + + private static final String join(String firstList, String optionalSecondList) + { + if (InternalStringUtils.isBlank(optionalSecondList)) + return firstList; + + return firstList + "," + optionalSecondList; + } + + /** + * Adds empty properties to the bean model. New properties are added with a <em>null</em> + * {@link org.apache.tapestry5.PropertyConduit}. ` + * + * @param model to be modified + * @param propertyNames comma-separated list of property names + * @see BeanModel#addEmpty(String) + */ + public static void add(BeanModel model, String propertyNames) + { + for (String name : split(propertyNames)) + { + model.addEmpty(name); + } + } + + /** + * Removes properties from the bean model. + * + * @param model + * @param propertyNames comma-separated list of property names + * @see BeanModel#exclude(String...) + */ + public static void exclude(BeanModel model, String propertyNames) + { + model.exclude(split(propertyNames)); + } + + /** + * Selects a subset of the properties to keep, and reorders them. + */ + public static void include(BeanModel model, String propertyNames) + { + model.include(split(propertyNames)); + } + + /** + * Reorders properties within the bean model. + * + * @param model + * @param propertyNames comma-separated list of property names + * @see BeanModel#reorder(String...) + */ + public static void reorder(BeanModel model, String propertyNames) + { + model.reorder(split(propertyNames)); + } + + static String[] split(String propertyNames) + { + String trimmed = propertyNames.trim(); + + if (trimmed.length() == 0) + return EMPTY_STRING_ARRAY; + + return trimmed.split("\\s*,\\s*"); + } +} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/PropertyModelImpl.java ---------------------------------------------------------------------- diff --git a/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/PropertyModelImpl.java b/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/PropertyModelImpl.java index b21e5bb..4632818 100644 --- a/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/PropertyModelImpl.java +++ b/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/PropertyModelImpl.java @@ -20,7 +20,7 @@ import org.apache.tapestry5.PropertyConduit; import org.apache.tapestry5.beaneditor.BeanModel; import org.apache.tapestry5.beaneditor.PropertyModel; import org.apache.tapestry5.beaneditor.Sortable; -import org.apache.tapestry5.internal.BeanModelUtils; +import org.apache.tapestry5.internal.InternalBeanModelUtils; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.internal.util.InternalStringUtils; import org.apache.tapestry5.plastic.PlasticUtils; @@ -48,9 +48,9 @@ public class PropertyModelImpl implements PropertyModel this.name = name; this.conduit = conduit; - id = BeanModelUtils.extractIdFromPropertyExpression(name); + id = InternalBeanModelUtils.extractIdFromPropertyExpression(name); - label = BeanModelUtils.defaultLabel(id, messages, name); + label = InternalBeanModelUtils.defaultLabel(id, messages, name); // TAP5-2305 if (conduit != null) http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/beanmodel/src/main/java/org/apache/tapestry5/internal/services/BeanModelSourceImpl.java ---------------------------------------------------------------------- diff --git a/beanmodel/src/main/java/org/apache/tapestry5/internal/services/BeanModelSourceImpl.java b/beanmodel/src/main/java/org/apache/tapestry5/internal/services/BeanModelSourceImpl.java new file mode 100644 index 0000000..bb20de0 --- /dev/null +++ b/beanmodel/src/main/java/org/apache/tapestry5/internal/services/BeanModelSourceImpl.java @@ -0,0 +1,222 @@ +// 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.internal.services; + +import org.apache.tapestry5.beaneditor.BeanModel; +import org.apache.tapestry5.beaneditor.NonVisual; +import org.apache.tapestry5.beaneditor.ReorderProperties; +import org.apache.tapestry5.internal.beaneditor.BeanModelImpl; +import org.apache.tapestry5.internal.beaneditor.BeanModelUtils; +import org.apache.tapestry5.ioc.Location; +import org.apache.tapestry5.ioc.Messages; +import org.apache.tapestry5.ioc.ObjectLocator; +import org.apache.tapestry5.ioc.annotations.Primary; +import org.apache.tapestry5.ioc.internal.util.CollectionFactory; +import org.apache.tapestry5.ioc.services.*; +import org.apache.tapestry5.services.BeanModelSource; +import org.apache.tapestry5.services.ComponentLayer; +import org.apache.tapestry5.services.DataTypeAnalyzer; +import org.apache.tapestry5.services.PropertyConduitSource; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Collections; +import java.util.List; + +public class BeanModelSourceImpl implements BeanModelSource +{ + private final TypeCoercer typeCoercer; + + private final PropertyAccess propertyAccess; + + private final PropertyConduitSource propertyConduitSource; + + private final PlasticProxyFactory proxyFactory; + + private final DataTypeAnalyzer dataTypeAnalyzer; + + private final ObjectLocator locator; + + private static class PropertyOrder implements Comparable<PropertyOrder> + { + final String propertyName; + + final int classDepth; + + final int sortKey; + + public PropertyOrder(final String propertyName, int classDepth, int sortKey) + { + this.propertyName = propertyName; + this.classDepth = classDepth; + this.sortKey = sortKey; + } + + public int compareTo(PropertyOrder o) + { + int result = classDepth - o.classDepth; + + if (result == 0) + result = sortKey - o.sortKey; + + if (result == 0) + result = propertyName.compareTo(o.propertyName); + + return result; + } + } + + /** + * @param classAdapter defines the bean that contains the properties + * @param propertyNames the initial set of property names, which will be rebuilt in the correct order + */ + private void orderProperties(ClassPropertyAdapter classAdapter, List<String> propertyNames) + { + List<PropertyOrder> properties = CollectionFactory.newList(); + + for (String name : propertyNames) + { + PropertyAdapter pa = classAdapter.getPropertyAdapter(name); + + Method readMethod = pa.getReadMethod(); + + Location location = readMethod == null ? null : proxyFactory.getMethodLocation(readMethod); + + int line = location == null ? -1 : location.getLine(); + + properties.add(new PropertyOrder(name, computeDepth(pa), line)); + } + + Collections.sort(properties); + + propertyNames.clear(); + + for (PropertyOrder po : properties) + { + propertyNames.add(po.propertyName); + } + } + + private static int computeDepth(PropertyAdapter pa) + { + int depth = 0; + Class c = pa.getDeclaringClass(); + + // When the method originates in an interface, the parent may be null, not Object. + + while (c != null && c != Object.class) + { + depth++; + c = c.getSuperclass(); + } + + return depth; + } + + public BeanModelSourceImpl(TypeCoercer typeCoercer, PropertyAccess propertyAccess, + PropertyConduitSource propertyConduitSource, + @ComponentLayer + PlasticProxyFactory proxyFactory, + @Primary + DataTypeAnalyzer dataTypeAnalyzer, ObjectLocator locator) + { + this.typeCoercer = typeCoercer; + this.propertyAccess = propertyAccess; + this.propertyConduitSource = propertyConduitSource; + this.proxyFactory = proxyFactory; + this.dataTypeAnalyzer = dataTypeAnalyzer; + this.locator = locator; + } + + public <T> BeanModel<T> createDisplayModel(Class<T> beanClass, Messages messages) + { + return create(beanClass, false, messages); + } + + public <T> BeanModel<T> createEditModel(Class<T> beanClass, Messages messages) + { + return create(beanClass, true, messages); + } + + public <T> BeanModel<T> create(Class<T> beanClass, boolean filterReadOnlyProperties, Messages messages) + { + assert beanClass != null; + assert messages != null; + ClassPropertyAdapter adapter = propertyAccess.getAdapter(beanClass); + + BeanModel<T> model = new BeanModelImpl<T>(beanClass, propertyConduitSource, typeCoercer, messages, locator); + + for (final String propertyName : adapter.getPropertyNames()) + { + PropertyAdapter pa = adapter.getPropertyAdapter(propertyName); + + if (!pa.isRead()) + { + continue; + } + + if (isStaticFieldProperty(pa)) + { + continue; + } + + if (pa.getAnnotation(NonVisual.class) != null) + { + continue; + } + + if (filterReadOnlyProperties && !pa.isUpdate()) + { + continue; + } + + final String dataType = dataTypeAnalyzer.identifyDataType(pa); + + // If an unregistered type, then ignore the property. + + if (dataType == null) + { + continue; + } + + model.add(propertyName).dataType(dataType); + } + + // First, order the properties based on the location of the getter method + // within the class. + + List<String> propertyNames = model.getPropertyNames(); + + orderProperties(adapter, propertyNames); + + model.reorder(propertyNames.toArray(new String[propertyNames.size()])); + + // Next, check for an annotation with specific ordering information. + + ReorderProperties reorderAnnotation = beanClass.getAnnotation(ReorderProperties.class); + + if (reorderAnnotation != null) + { + BeanModelUtils.reorder(model, reorderAnnotation.value()); + } + + return model; + } + + private boolean isStaticFieldProperty(PropertyAdapter adapter) + { + return adapter.isField() && Modifier.isStatic(adapter.getField().getModifiers()); + } +} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java ---------------------------------------------------------------------- diff --git a/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java b/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java index 83f67fa..4ce072e 100644 --- a/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java +++ b/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java @@ -19,7 +19,7 @@ import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.tree.Tree; import org.apache.tapestry5.PropertyConduit; import org.apache.tapestry5.PropertyConduit2; -import org.apache.tapestry5.internal.BeanModelUtils; +import org.apache.tapestry5.internal.InternalBeanModelUtils; import org.apache.tapestry5.internal.InternalPropertyConduit; import org.apache.tapestry5.internal.antlr.PropertyExpressionLexer; import org.apache.tapestry5.internal.antlr.PropertyExpressionParser; @@ -1260,7 +1260,7 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource Type returnType = GenericsUtils.extractActualType(activeType, method); - return new Term(returnType, toUniqueId(method), BeanModelUtils.toAnnotationProvider(method), new InstructionBuilderCallback() + return new Term(returnType, toUniqueId(method), InternalBeanModelUtils.toAnnotationProvider(method), new InstructionBuilderCallback() { public void doBuild(InstructionBuilder builder) { http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/commons/src/main/java/org/apache/tapestry5/services/DataTypeAnalyzer.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/tapestry5/services/DataTypeAnalyzer.java b/commons/src/main/java/org/apache/tapestry5/services/DataTypeAnalyzer.java new file mode 100644 index 0000000..ba7e995 --- /dev/null +++ b/commons/src/main/java/org/apache/tapestry5/services/DataTypeAnalyzer.java @@ -0,0 +1,48 @@ +// Copyright 2007, 2008, 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.services; + +import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration; +import org.apache.tapestry5.ioc.annotations.UsesOrderedConfiguration; +import org.apache.tapestry5.ioc.services.PropertyAdapter; + +/** + * Used by {@link BeanModelSource} to identify the type of data associated with a particular property (represented as a + * {@link PropertyAdapter}). The data type is a string used to determine what kind of interface to use for displaying + * the value of the property, or what kind of interface to use for editing the value of the property. Common property + * types are "text", "enum", "checkbox", but the list is extensible. + * <p/> + * Different strategies for identifying the data type are encapsulated in the DataTypeAnalyzer service, forming a + * chain of command. + * <p/> + * The DefaultDataTypeAnalyzer service maps property types to data type names. + * <p/> + * The DataTypeAnalyzer service is an extensible {@linkplain org.apache.tapestry5.ioc.services.ChainBuilder chain of + * command}), that (by default) includes {@link org.apache.tapestry5.internal.services.AnnotationDataTypeAnalyzer} and + * the {@link org.apache.tapestry5.internal.services.DefaultDataTypeAnalyzer} service (ordered last). It uses an ordered configuration. + * + * @see org.apache.tapestry5.corelib.components.Grid + * @see org.apache.tapestry5.corelib.components.BeanEditForm + * @see BeanBlockSource + */ +@UsesOrderedConfiguration(DataTypeAnalyzer.class) +@UsesMappedConfiguration(key = Class.class, value = String.class) +public interface DataTypeAnalyzer +{ + /** + * Identifies the data type, if known, or returns null if not known. + */ + String identifyDataType(PropertyAdapter adapter); +} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java index aba7225..e69377f 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java @@ -59,7 +59,7 @@ public class TapestryInternalUtils */ public static String toUserPresentable(String id) { - return BeanModelUtils.toUserPresentable(id); + return InternalBeanModelUtils.toUserPresentable(id); } public static Map<String, String> mapFromKeysAndValues(String... keysAndValues) @@ -228,7 +228,7 @@ public class TapestryInternalUtils */ public static String extractIdFromPropertyExpression(String expression) { - return BeanModelUtils.extractIdFromPropertyExpression(expression); + return InternalBeanModelUtils.extractIdFromPropertyExpression(expression); } /** @@ -237,7 +237,7 @@ public class TapestryInternalUtils */ public static String defaultLabel(String id, Messages messages, String propertyExpression) { - return BeanModelUtils.defaultLabel(id, messages, propertyExpression); + return InternalBeanModelUtils.defaultLabel(id, messages, propertyExpression); } /** @@ -304,7 +304,7 @@ public class TapestryInternalUtils private static String replace(String input, Pattern pattern, String replacement) { - return BeanModelUtils.replace(input, pattern, replacement); + return InternalBeanModelUtils.replace(input, pattern, replacement); } /** http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelUtils.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelUtils.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelUtils.java deleted file mode 100644 index 6a79b6e..0000000 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelUtils.java +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2007, 2008, 2009, 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.internal.beaneditor; - -import org.apache.tapestry5.beaneditor.BeanModel; -import org.apache.tapestry5.internal.InternalConstants; -import org.apache.tapestry5.ioc.internal.util.InternalUtils; - -/** - * Utilities used in a few places to modify an existing {@link BeanModel}. - */ -public final class BeanModelUtils -{ - - /** - * Performs standard set of modifications to a {@link org.apache.tapestry5.beaneditor.BeanModel} - * . First new - * properties may be added, then properties removed, then properties reordered. - * - * @param model to modifiy - * @param addPropertyNames comma seperated list of property names to add, or null - * @param includePropertyNames comma seperated list of property names to include - * @param excludePropertyNames comma seperated list of property names to exclude, or null - * @param reorderPropertyNames comma seperated list of property names to reorder, or null - */ - public static void modify(BeanModel model, String addPropertyNames, - String includePropertyNames, String excludePropertyNames, String reorderPropertyNames) - { - if (addPropertyNames != null) - add(model, addPropertyNames); - - if (includePropertyNames != null) - include(model, join(includePropertyNames, addPropertyNames)); - - if (excludePropertyNames != null) - exclude(model, excludePropertyNames); - - if (reorderPropertyNames != null) - reorder(model, reorderPropertyNames); - } - - private static final String join(String firstList, String optionalSecondList) - { - if (InternalUtils.isBlank(optionalSecondList)) - return firstList; - - return firstList + "," + optionalSecondList; - } - - /** - * Adds empty properties to the bean model. New properties are added with a <em>null</em> - * {@link org.apache.tapestry5.PropertyConduit}. ` - * - * @param model to be modified - * @param propertyNames comma-separated list of property names - * @see BeanModel#addEmpty(String) - */ - public static void add(BeanModel model, String propertyNames) - { - for (String name : split(propertyNames)) - { - model.addEmpty(name); - } - } - - /** - * Removes properties from the bean model. - * - * @param model - * @param propertyNames comma-separated list of property names - * @see BeanModel#exclude(String...) - */ - public static void exclude(BeanModel model, String propertyNames) - { - model.exclude(split(propertyNames)); - } - - /** - * Selects a subset of the properties to keep, and reorders them. - */ - public static void include(BeanModel model, String propertyNames) - { - model.include(split(propertyNames)); - } - - /** - * Reorders properties within the bean model. - * - * @param model - * @param propertyNames comma-separated list of property names - * @see BeanModel#reorder(String...) - */ - public static void reorder(BeanModel model, String propertyNames) - { - model.reorder(split(propertyNames)); - } - - static String[] split(String propertyNames) - { - String trimmed = propertyNames.trim(); - - if (trimmed.length() == 0) - return InternalConstants.EMPTY_STRING_ARRAY; - - return trimmed.split("\\s*,\\s*"); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BeanModelSourceImpl.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BeanModelSourceImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BeanModelSourceImpl.java deleted file mode 100644 index bb20de0..0000000 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BeanModelSourceImpl.java +++ /dev/null @@ -1,222 +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.internal.services; - -import org.apache.tapestry5.beaneditor.BeanModel; -import org.apache.tapestry5.beaneditor.NonVisual; -import org.apache.tapestry5.beaneditor.ReorderProperties; -import org.apache.tapestry5.internal.beaneditor.BeanModelImpl; -import org.apache.tapestry5.internal.beaneditor.BeanModelUtils; -import org.apache.tapestry5.ioc.Location; -import org.apache.tapestry5.ioc.Messages; -import org.apache.tapestry5.ioc.ObjectLocator; -import org.apache.tapestry5.ioc.annotations.Primary; -import org.apache.tapestry5.ioc.internal.util.CollectionFactory; -import org.apache.tapestry5.ioc.services.*; -import org.apache.tapestry5.services.BeanModelSource; -import org.apache.tapestry5.services.ComponentLayer; -import org.apache.tapestry5.services.DataTypeAnalyzer; -import org.apache.tapestry5.services.PropertyConduitSource; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Collections; -import java.util.List; - -public class BeanModelSourceImpl implements BeanModelSource -{ - private final TypeCoercer typeCoercer; - - private final PropertyAccess propertyAccess; - - private final PropertyConduitSource propertyConduitSource; - - private final PlasticProxyFactory proxyFactory; - - private final DataTypeAnalyzer dataTypeAnalyzer; - - private final ObjectLocator locator; - - private static class PropertyOrder implements Comparable<PropertyOrder> - { - final String propertyName; - - final int classDepth; - - final int sortKey; - - public PropertyOrder(final String propertyName, int classDepth, int sortKey) - { - this.propertyName = propertyName; - this.classDepth = classDepth; - this.sortKey = sortKey; - } - - public int compareTo(PropertyOrder o) - { - int result = classDepth - o.classDepth; - - if (result == 0) - result = sortKey - o.sortKey; - - if (result == 0) - result = propertyName.compareTo(o.propertyName); - - return result; - } - } - - /** - * @param classAdapter defines the bean that contains the properties - * @param propertyNames the initial set of property names, which will be rebuilt in the correct order - */ - private void orderProperties(ClassPropertyAdapter classAdapter, List<String> propertyNames) - { - List<PropertyOrder> properties = CollectionFactory.newList(); - - for (String name : propertyNames) - { - PropertyAdapter pa = classAdapter.getPropertyAdapter(name); - - Method readMethod = pa.getReadMethod(); - - Location location = readMethod == null ? null : proxyFactory.getMethodLocation(readMethod); - - int line = location == null ? -1 : location.getLine(); - - properties.add(new PropertyOrder(name, computeDepth(pa), line)); - } - - Collections.sort(properties); - - propertyNames.clear(); - - for (PropertyOrder po : properties) - { - propertyNames.add(po.propertyName); - } - } - - private static int computeDepth(PropertyAdapter pa) - { - int depth = 0; - Class c = pa.getDeclaringClass(); - - // When the method originates in an interface, the parent may be null, not Object. - - while (c != null && c != Object.class) - { - depth++; - c = c.getSuperclass(); - } - - return depth; - } - - public BeanModelSourceImpl(TypeCoercer typeCoercer, PropertyAccess propertyAccess, - PropertyConduitSource propertyConduitSource, - @ComponentLayer - PlasticProxyFactory proxyFactory, - @Primary - DataTypeAnalyzer dataTypeAnalyzer, ObjectLocator locator) - { - this.typeCoercer = typeCoercer; - this.propertyAccess = propertyAccess; - this.propertyConduitSource = propertyConduitSource; - this.proxyFactory = proxyFactory; - this.dataTypeAnalyzer = dataTypeAnalyzer; - this.locator = locator; - } - - public <T> BeanModel<T> createDisplayModel(Class<T> beanClass, Messages messages) - { - return create(beanClass, false, messages); - } - - public <T> BeanModel<T> createEditModel(Class<T> beanClass, Messages messages) - { - return create(beanClass, true, messages); - } - - public <T> BeanModel<T> create(Class<T> beanClass, boolean filterReadOnlyProperties, Messages messages) - { - assert beanClass != null; - assert messages != null; - ClassPropertyAdapter adapter = propertyAccess.getAdapter(beanClass); - - BeanModel<T> model = new BeanModelImpl<T>(beanClass, propertyConduitSource, typeCoercer, messages, locator); - - for (final String propertyName : adapter.getPropertyNames()) - { - PropertyAdapter pa = adapter.getPropertyAdapter(propertyName); - - if (!pa.isRead()) - { - continue; - } - - if (isStaticFieldProperty(pa)) - { - continue; - } - - if (pa.getAnnotation(NonVisual.class) != null) - { - continue; - } - - if (filterReadOnlyProperties && !pa.isUpdate()) - { - continue; - } - - final String dataType = dataTypeAnalyzer.identifyDataType(pa); - - // If an unregistered type, then ignore the property. - - if (dataType == null) - { - continue; - } - - model.add(propertyName).dataType(dataType); - } - - // First, order the properties based on the location of the getter method - // within the class. - - List<String> propertyNames = model.getPropertyNames(); - - orderProperties(adapter, propertyNames); - - model.reorder(propertyNames.toArray(new String[propertyNames.size()])); - - // Next, check for an annotation with specific ordering information. - - ReorderProperties reorderAnnotation = beanClass.getAnnotation(ReorderProperties.class); - - if (reorderAnnotation != null) - { - BeanModelUtils.reorder(model, reorderAnnotation.value()); - } - - return model; - } - - private boolean isStaticFieldProperty(PropertyAdapter adapter) - { - return adapter.isField() && Modifier.isStatic(adapter.getField().getModifiers()); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/tapestry-core/src/main/java/org/apache/tapestry5/services/DataTypeAnalyzer.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/DataTypeAnalyzer.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/DataTypeAnalyzer.java deleted file mode 100644 index ba7e995..0000000 --- a/tapestry-core/src/main/java/org/apache/tapestry5/services/DataTypeAnalyzer.java +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2007, 2008, 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.services; - -import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration; -import org.apache.tapestry5.ioc.annotations.UsesOrderedConfiguration; -import org.apache.tapestry5.ioc.services.PropertyAdapter; - -/** - * Used by {@link BeanModelSource} to identify the type of data associated with a particular property (represented as a - * {@link PropertyAdapter}). The data type is a string used to determine what kind of interface to use for displaying - * the value of the property, or what kind of interface to use for editing the value of the property. Common property - * types are "text", "enum", "checkbox", but the list is extensible. - * <p/> - * Different strategies for identifying the data type are encapsulated in the DataTypeAnalyzer service, forming a - * chain of command. - * <p/> - * The DefaultDataTypeAnalyzer service maps property types to data type names. - * <p/> - * The DataTypeAnalyzer service is an extensible {@linkplain org.apache.tapestry5.ioc.services.ChainBuilder chain of - * command}), that (by default) includes {@link org.apache.tapestry5.internal.services.AnnotationDataTypeAnalyzer} and - * the {@link org.apache.tapestry5.internal.services.DefaultDataTypeAnalyzer} service (ordered last). It uses an ordered configuration. - * - * @see org.apache.tapestry5.corelib.components.Grid - * @see org.apache.tapestry5.corelib.components.BeanEditForm - * @see BeanBlockSource - */ -@UsesOrderedConfiguration(DataTypeAnalyzer.class) -@UsesMappedConfiguration(key = Class.class, value = String.class) -public interface DataTypeAnalyzer -{ - /** - * Identifies the data type, if known, or returns null if not known. - */ - String identifyDataType(PropertyAdapter adapter); -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/UsesMappedConfiguration.java ---------------------------------------------------------------------- diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/UsesMappedConfiguration.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/UsesMappedConfiguration.java deleted file mode 100644 index a336365..0000000 --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/UsesMappedConfiguration.java +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2008, 2009 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.annotations; - -import java.lang.annotation.*; - -/** - * A documentation-only interface placed on service interfaces for services which have a {@linkplain - * org.apache.tapestry5.ioc.MappedConfiguration mapped configuration}, to identify the type of key (often, a String), - * and type ofcontribution. - * <p/> - * Remember that when the key type is String, the map will be case-insensitive. - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.CLASS) -@Documented -@UseWith(AnnotationUseContext.SERVICE) -public @interface UsesMappedConfiguration -{ - /** - * The type of key used to identify contribution values. - */ - Class key() default String.class; - - /** - * The type of object which may be contributed into the service's configuration. - */ - Class value(); -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/UsesOrderedConfiguration.java ---------------------------------------------------------------------- diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/UsesOrderedConfiguration.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/UsesOrderedConfiguration.java deleted file mode 100644 index 7c608f6..0000000 --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/UsesOrderedConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2008, 2009 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.annotations; - -import java.lang.annotation.*; - -/** - * A documentation-only interface placed on service interfaces for services which have an {@linkplain - * org.apache.tapestry5.ioc.OrderedConfiguration ordered configuration}, to identify the type of contribution. - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.CLASS) -@Documented -@UseWith(AnnotationUseContext.SERVICE) -public @interface UsesOrderedConfiguration -{ - /** - * The type of object which may be contributed into the service's configuration. - */ - Class value(); -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/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 a40f984..8f1f7b6 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,7 @@ 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.BeanModelUtils; +import org.apache.tapestry5.internal.InternalBeanModelUtils; import org.apache.tapestry5.internal.plastic.PlasticInternalUtils; import org.apache.tapestry5.ioc.*; import org.apache.tapestry5.ioc.annotations.*; @@ -777,7 +777,7 @@ public class InternalUtils */ public static AnnotationProvider toAnnotationProvider(final Class element) { - return BeanModelUtils.toAnnotationProvider(element); + return InternalBeanModelUtils.toAnnotationProvider(element); } /** @@ -1404,7 +1404,7 @@ public class InternalUtils public static AnnotationProvider toAnnotationProvider(final Method element) { - return BeanModelUtils.toAnnotationProvider(element); + return InternalBeanModelUtils.toAnnotationProvider(element); } public static <T> ObjectCreator<T> createConstructorConstructionPlan(final OperationTracker tracker, final ObjectLocator locator, http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/UsesMappedConfiguration.java ---------------------------------------------------------------------- diff --git a/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/UsesMappedConfiguration.java b/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/UsesMappedConfiguration.java new file mode 100644 index 0000000..a336365 --- /dev/null +++ b/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/UsesMappedConfiguration.java @@ -0,0 +1,41 @@ +// Copyright 2008, 2009 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.annotations; + +import java.lang.annotation.*; + +/** + * A documentation-only interface placed on service interfaces for services which have a {@linkplain + * org.apache.tapestry5.ioc.MappedConfiguration mapped configuration}, to identify the type of key (often, a String), + * and type ofcontribution. + * <p/> + * Remember that when the key type is String, the map will be case-insensitive. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.CLASS) +@Documented +@UseWith(AnnotationUseContext.SERVICE) +public @interface UsesMappedConfiguration +{ + /** + * The type of key used to identify contribution values. + */ + Class key() default String.class; + + /** + * The type of object which may be contributed into the service's configuration. + */ + Class value(); +} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f9e5699/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/UsesOrderedConfiguration.java ---------------------------------------------------------------------- diff --git a/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/UsesOrderedConfiguration.java b/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/UsesOrderedConfiguration.java new file mode 100644 index 0000000..7c608f6 --- /dev/null +++ b/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/UsesOrderedConfiguration.java @@ -0,0 +1,33 @@ +// Copyright 2008, 2009 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.annotations; + +import java.lang.annotation.*; + +/** + * A documentation-only interface placed on service interfaces for services which have an {@linkplain + * org.apache.tapestry5.ioc.OrderedConfiguration ordered configuration}, to identify the type of contribution. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.CLASS) +@Documented +@UseWith(AnnotationUseContext.SERVICE) +public @interface UsesOrderedConfiguration +{ + /** + * The type of object which may be contributed into the service's configuration. + */ + Class value(); +}
