Second 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/d54315f6 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/d54315f6 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/d54315f6 Branch: refs/heads/beanmodel-split Commit: d54315f6721d846b66a3081f93e47d8392fe661f Parents: 7ba99e0 Author: Thiago H. de Paula Figueiredo <thiag...@apache.org> Authored: Sat Dec 6 16:42:10 2014 -0200 Committer: Thiago H. de Paula Figueiredo <thiag...@apache.org> Committed: Sat Dec 6 20:32:39 2014 -0200 ---------------------------------------------------------------------- beanmodel/.gitignore | 4 + beanmodel/build.gradle | 51 ++++- .../tapestry5/internal/BeanModelUtils.java | 145 +++++++++++++ .../internal/beaneditor/BeanModelImpl.java | 4 +- .../internal/beaneditor/PropertyModelImpl.java | 14 +- .../services/PropertyConduitDelegate.java | 1 - .../services/PropertyConduitSourceImpl.java | 10 +- .../org/apache/tapestry5/ioc/ObjectLocator.java | 3 +- .../ioc/internal/util/InternalStringUtils.java | 203 +++++++++++++++++++ .../ioc/internal/util/TapestryException.java | 23 ++- .../tapestry5/ioc/util/AvailableValues.java | 4 +- tapestry-core/build.gradle | 37 ---- .../internal/TapestryInternalUtils.java | 46 +---- .../ioc/internal/util/InternalUtils.java | 142 +++---------- 14 files changed, 472 insertions(+), 215 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/beanmodel/.gitignore ---------------------------------------------------------------------- diff --git a/beanmodel/.gitignore b/beanmodel/.gitignore new file mode 100644 index 0000000..f739972 --- /dev/null +++ b/beanmodel/.gitignore @@ -0,0 +1,4 @@ +docs +/.externalToolBuilders +src/main/generated +src/test/generated http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/beanmodel/build.gradle ---------------------------------------------------------------------- diff --git a/beanmodel/build.gradle b/beanmodel/build.gradle index ccdeb37..c09ebdd 100644 --- a/beanmodel/build.gradle +++ b/beanmodel/build.gradle @@ -6,7 +6,18 @@ description = "Fast class property discovery, reading and writing library based //apply plugin: JavaPlugin buildDir = 'target/gradle-build' - + +project.ext { + antlrSource = "src/main/antlr" + mainGeneratedDir = "src/main/generated" + testGeneratedDir = "src/test/generated" + antlrOutput = "$mainGeneratedDir/antlr" +} + +configurations { + antlr3 +} + project.ext.libraryVersions = [ jcache: '1.0.0', ] @@ -15,12 +26,50 @@ dependencies { compile project(":plastic") compile project(":tapestry5-annotations") compile project(":commons") + + // Antlr3 tool path used with the antlr3 task + antlr3 "org.antlr:antlr:3.5.2" + // Transitive will bring in the unwanted string template library as well compile "org.antlr:antlr-runtime:3.5.2", { exclude group: "org.antlr", module: "stringtemplate" } } +// This may spin out as a plugin once we've got the details down pat + +task generateGrammarSource(type: JavaExec) { + description "Generates Java sources from Antlr3 grammars." + inputs.source fileTree(dir: antlrSource, include: "**/*.g") + outputs.dir file(antlrOutput) + + classpath configurations.antlr3 + + main "org.antlr.Tool" + args "-o", "${antlrOutput}/org/apache/tapestry5/internal/antlr" + args inputs.sourceFiles + + doFirst { + logger.info "Executing Antlr3 grammar generation:\n${commandLine.join(' ')}" + } +} + +sourceSets { + main { + output.dir(antlrOutput, builtBy: generateGrammarSource) + java { + srcDir antlrOutput + } + } +} + +clean.delete mainGeneratedDir, testGeneratedDir + +compileJava { + dependsOn generateGrammarSource + options.fork(memoryMaximumSize: '512m') +} + jar { manifest { } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/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 new file mode 100644 index 0000000..08cb88a --- /dev/null +++ b/beanmodel/src/main/java/org/apache/tapestry5/internal/BeanModelUtils.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 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/d54315f6/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelImpl.java ---------------------------------------------------------------------- diff --git a/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelImpl.java b/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelImpl.java index 26eb309..b72a3d6 100644 --- a/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelImpl.java +++ b/beanmodel/src/main/java/org/apache/tapestry5/internal/beaneditor/BeanModelImpl.java @@ -22,7 +22,7 @@ import org.apache.tapestry5.internal.services.CoercingPropertyConduitWrapper; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.ObjectLocator; import org.apache.tapestry5.ioc.internal.util.CollectionFactory; -import org.apache.tapestry5.ioc.internal.util.InternalUtils; +import org.apache.tapestry5.ioc.internal.util.InternalStringUtils; import org.apache.tapestry5.ioc.services.TypeCoercer; import org.apache.tapestry5.ioc.util.AvailableValues; import org.apache.tapestry5.ioc.util.UnknownValueException; @@ -93,7 +93,7 @@ public class BeanModelImpl<T> implements BeanModel<T> private void validateNewPropertyName(String propertyName) { - assert InternalUtils.isNonBlank(propertyName); + assert InternalStringUtils.isNonBlank(propertyName); if (properties.containsKey(propertyName)) throw new RuntimeException(String.format( "Bean editor model for %s already contains a property model for property '%s'.", http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/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 703ce44..b21e5bb 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 @@ -14,17 +14,17 @@ package org.apache.tapestry5.internal.beaneditor; +import java.lang.annotation.Annotation; + 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.TapestryInternalUtils; +import org.apache.tapestry5.internal.BeanModelUtils; import org.apache.tapestry5.ioc.Messages; -import org.apache.tapestry5.ioc.internal.util.InternalUtils; +import org.apache.tapestry5.ioc.internal.util.InternalStringUtils; import org.apache.tapestry5.plastic.PlasticUtils; -import java.lang.annotation.Annotation; - @SuppressWarnings("all") public class PropertyModelImpl implements PropertyModel { @@ -48,9 +48,9 @@ public class PropertyModelImpl implements PropertyModel this.name = name; this.conduit = conduit; - id = TapestryInternalUtils.extractIdFromPropertyExpression(name); + id = BeanModelUtils.extractIdFromPropertyExpression(name); - label = TapestryInternalUtils.defaultLabel(id, messages, name); + label = BeanModelUtils.defaultLabel(id, messages, name); // TAP5-2305 if (conduit != null) @@ -87,7 +87,7 @@ public class PropertyModelImpl implements PropertyModel public PropertyModel label(String label) { - assert InternalUtils.isNonBlank(label); + assert InternalStringUtils.isNonBlank(label); this.label = label; return this; http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java ---------------------------------------------------------------------- diff --git a/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java b/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java index 1242031..3849103 100644 --- a/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java +++ b/beanmodel/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitDelegate.java @@ -19,7 +19,6 @@ import java.lang.annotation.Annotation; import org.apache.tapestry5.internal.InternalPropertyConduit; import org.apache.tapestry5.internal.util.IntegerRange; import org.apache.tapestry5.ioc.AnnotationProvider; -import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.ioc.services.TypeCoercer; /** http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/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 701420f..83f67fa 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,6 +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.InternalPropertyConduit; import org.apache.tapestry5.internal.antlr.PropertyExpressionLexer; import org.apache.tapestry5.internal.antlr.PropertyExpressionParser; @@ -29,7 +30,7 @@ import org.apache.tapestry5.ioc.annotations.PostInjection; import org.apache.tapestry5.ioc.internal.NullAnnotationProvider; import org.apache.tapestry5.ioc.internal.util.CollectionFactory; import org.apache.tapestry5.ioc.internal.util.GenericsUtils; -import org.apache.tapestry5.ioc.internal.util.InternalUtils; +import org.apache.tapestry5.ioc.internal.util.InternalStringUtils; import org.apache.tapestry5.ioc.services.*; import org.apache.tapestry5.ioc.util.AvailableValues; import org.apache.tapestry5.ioc.util.ExceptionUtils; @@ -1106,7 +1107,7 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource String message = String.format("Node %s was type %s, but was expected to be (one of) %s.", node.toStringTree(), PropertyExpressionParser.tokenNames[node.getType()], - InternalUtils.joinSorted(tokenNames)); + InternalStringUtils.joinSorted(tokenNames)); return new RuntimeException(message); } @@ -1259,7 +1260,7 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource Type returnType = GenericsUtils.extractActualType(activeType, method); - return new Term(returnType, toUniqueId(method), InternalUtils.toAnnotationProvider(method), new InstructionBuilderCallback() + return new Term(returnType, toUniqueId(method), BeanModelUtils.toAnnotationProvider(method), new InstructionBuilderCallback() { public void doBuild(InstructionBuilder builder) { @@ -1363,7 +1364,7 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource public PropertyConduit create(Class rootClass, String expression) { assert rootClass != null; - assert InternalUtils.isNonBlank(expression); + assert InternalStringUtils.isNonBlank(expression); MultiKey key = new MultiKey(rootClass, expression); @@ -1560,4 +1561,5 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource return builder.append(")").toString(); } + } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/commons/src/main/java/org/apache/tapestry5/ioc/ObjectLocator.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/tapestry5/ioc/ObjectLocator.java b/commons/src/main/java/org/apache/tapestry5/ioc/ObjectLocator.java index 81d1f77..e60c0d9 100644 --- a/commons/src/main/java/org/apache/tapestry5/ioc/ObjectLocator.java +++ b/commons/src/main/java/org/apache/tapestry5/ioc/ObjectLocator.java @@ -1,4 +1,4 @@ -// Copyright 2006, 2007, 2010, 2011 The Apache Software Foundation +// Copyright 2006, 2007, 2010, 2011, 2014 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. @@ -15,7 +15,6 @@ package org.apache.tapestry5.ioc; import org.apache.tapestry5.ioc.annotations.Inject; -import org.apache.tapestry5.ioc.services.MasterObjectProvider; import java.lang.annotation.Annotation; http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalStringUtils.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalStringUtils.java b/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalStringUtils.java new file mode 100644 index 0000000..e345593 --- /dev/null +++ b/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalStringUtils.java @@ -0,0 +1,203 @@ +// Copyright 2006-2014 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.lang.reflect.Method; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * String-related utilities used within various internal implementations of the Apache Tapestry subprojects. + * Broken off Tapestry-IoC's InternalUtils. + */ +@SuppressWarnings("all") +public class InternalStringUtils +{ + + /** + * Pattern used to eliminate leading and trailing underscores and dollar signs. + */ + private static final Pattern NAME_PATTERN = Pattern.compile("^[_|$]*([\\p{javaJavaIdentifierPart}]+?)[_|$]*$", + Pattern.CASE_INSENSITIVE); + + /** + * Converts a method to a user presentable string consisting of the containing class name, the method name, and the + * short form of the parameter list (the class name of each parameter type, shorn of the package name portion). + * + * @param method + * @return short string representation + */ + public static String asString(Method method) + { + StringBuilder buffer = new StringBuilder(); + + buffer.append(method.getDeclaringClass().getName()); + buffer.append("."); + buffer.append(method.getName()); + buffer.append("("); + + for (int i = 0; i < method.getParameterTypes().length; i++) + { + if (i > 0) + buffer.append(", "); + + String name = method.getParameterTypes()[i].getSimpleName(); + + buffer.append(name); + } + + return buffer.append(")").toString(); + } + + /** + * Strips leading "_" and "$" and trailing "_" from the name. + */ + public static String stripMemberName(String memberName) + { + assert isNonBlank(memberName); + Matcher matcher = NAME_PATTERN.matcher(memberName); + + if (!matcher.matches()) + throw new IllegalArgumentException(String.format("Input '%s' is not a valid Java identifier.", memberName)); + + return matcher.group(1); + } + + /** + * Joins together some number of elements to form a comma separated list. + */ + public static String join(List elements) + { + return join(elements, ", "); + } + + /** + * Joins together some number of elements. If a value in the list is the empty string, it is replaced with the + * string "(blank)". + * + * @param elements + * objects to be joined together + * @param separator + * used between elements when joining + */ + public static String join(List elements, String separator) + { + switch (elements.size()) + { + case 0: + return ""; + + case 1: + return elements.get(0).toString(); + + default: + + StringBuilder buffer = new StringBuilder(); + boolean first = true; + + for (Object o : elements) + { + if (!first) + buffer.append(separator); + + String string = String.valueOf(o); + + if (string.equals("")) + string = "(blank)"; + + buffer.append(string); + + first = false; + } + + return buffer.toString(); + } + } + + /** + * Creates a sorted copy of the provided elements, then turns that into a comma separated list. + * + * @return the elements converted to strings, sorted, joined with comma ... or "(none)" if the elements are null or + * empty + */ + public static String joinSorted(Collection elements) + { + if (elements == null || elements.isEmpty()) + return "(none)"; + + List<String> list = CollectionFactory.newList(); + + for (Object o : elements) + list.add(String.valueOf(o)); + + Collections.sort(list); + + return join(list); + } + + /** + * Returns true if the input is null, or is a zero length string (excluding leading/trailing whitespace). + */ + + public static boolean isBlank(String input) + { + return input == null || input.length() == 0 || input.trim().length() == 0; + } + + public static boolean isNonBlank(String input) + { + return !isBlank(input); + } + + /** + * Capitalizes a string, converting the first character to uppercase. + */ + public static String capitalize(String input) + { + if (input.length() == 0) + return input; + + return input.substring(0, 1).toUpperCase() + input.substring(1); + } + + /** + * Return true if the input string contains the marker for symbols that must be expanded. + */ + public static boolean containsSymbols(String input) + { + return input.contains("${"); + } + + /** + * Searches the string for the final period ('.') character and returns everything after that. The input string is + * 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. + */ + public static String lastTerm(String input) + { + assert isNonBlank(input); + int dotx = input.lastIndexOf('.'); + + if (dotx < 0) + return input; + + return input.substring(dotx + 1); + } + +} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/TapestryException.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/TapestryException.java b/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/TapestryException.java index ef217cb..d8d8018 100644 --- a/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/TapestryException.java +++ b/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/TapestryException.java @@ -34,7 +34,7 @@ public class TapestryException extends RuntimeException implements Locatable */ public TapestryException(String message, Object location, Throwable cause) { - this(message, InternalUtils.locationOf(location), cause); + this(message, locationOf(location), cause); } /** @@ -71,5 +71,26 @@ public class TapestryException extends RuntimeException implements Locatable return String.format("%s [at %s]", super.toString(), location); } + + /** + * Sniffs the object to see if it is a {@link Location} or {@link Locatable}. Returns null if null or not + * convertable to a location. + * Copied from InternalUtils to avoid having it moved to BeanModel or Commons subprojects. + */ + + private 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; + } + } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/commons/src/main/java/org/apache/tapestry5/ioc/util/AvailableValues.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/tapestry5/ioc/util/AvailableValues.java b/commons/src/main/java/org/apache/tapestry5/ioc/util/AvailableValues.java index c4c5c6d..8c9cb3f 100644 --- a/commons/src/main/java/org/apache/tapestry5/ioc/util/AvailableValues.java +++ b/commons/src/main/java/org/apache/tapestry5/ioc/util/AvailableValues.java @@ -20,7 +20,7 @@ import java.util.List; 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.internal.util.InternalStringUtils; /** * Used (as part of a {@link UnknownValueException} to identify what available values @@ -81,7 +81,7 @@ public class AvailableValues @Override public String toString() { - return String.format("AvailableValues[%s: %s]", valueType, InternalUtils.join(values)); + return String.format("AvailableValues[%s: %s]", valueType, InternalStringUtils.join(values)); } } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/tapestry-core/build.gradle ---------------------------------------------------------------------- diff --git a/tapestry-core/build.gradle b/tapestry-core/build.gradle index 584200a..d35c166 100644 --- a/tapestry-core/build.gradle +++ b/tapestry-core/build.gradle @@ -8,11 +8,6 @@ project.ext { antlrSource = "src/main/antlr" mainGeneratedDir = "src/main/generated" testGeneratedDir = "src/test/generated" - antlrOutput = "$mainGeneratedDir/antlr" -} - -configurations { - antlr3 } dependencies { @@ -27,30 +22,9 @@ dependencies { compile "commons-codec:commons-codec:1.5" - // Antlr3 tool path used with the antlr3 task - antlr3 "org.antlr:antlr:3.5.2" - testRuntime "org.hsqldb:hsqldb:1.8.0.10" } -// This may spin out as a plugin once we've got the details down pat - -task generateGrammarSource(type: JavaExec) { - description "Generates Java sources from Antlr3 grammars." - inputs.source fileTree(dir: antlrSource, include: "**/*.g") - outputs.dir file(antlrOutput) - - classpath configurations.antlr3 - - main "org.antlr.Tool" - args "-o", "${antlrOutput}/org/apache/tapestry5/internal/antlr" - args inputs.sourceFiles - - doFirst { - logger.info "Executing Antlr3 grammar generation:\n${commandLine.join(' ')}" - } -} - task preprocessCoffeeScript(type: PreprocessCoffeeScript) { } @@ -73,23 +47,12 @@ sourceSets { main { output.dir(compileCoffeeScript.outputDir, builtBy: compileCoffeeScript) output.dir(compileProcessedCoffeescript.outputDir, builtBy: compileProcessedCoffeescript) - output.dir(antlrOutput, builtBy: generateGrammarSource) - java { - srcDir antlrOutput - } } test { output.dir(compileTestCoffeeScript.outputDir, builtBy: compileTestCoffeeScript) } } -clean.delete mainGeneratedDir, testGeneratedDir - -compileJava { - dependsOn generateGrammarSource - options.fork(memoryMaximumSize: '512m') -} - // Not sure why this is necessary: compileTestGroovy.dependsOn compileTestJava http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/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 3435d64..aba7225 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,40 +59,7 @@ public class TapestryInternalUtils */ 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(); + return BeanModelUtils.toUserPresentable(id); } public static Map<String, String> mapFromKeysAndValues(String... keysAndValues) @@ -261,7 +228,7 @@ public class TapestryInternalUtils */ public static String extractIdFromPropertyExpression(String expression) { - return replace(expression, NON_WORD_PATTERN, ""); + return BeanModelUtils.extractIdFromPropertyExpression(expression); } /** @@ -270,12 +237,7 @@ public class TapestryInternalUtils */ 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(lastTerm(propertyExpression))); + return BeanModelUtils.defaultLabel(id, messages, propertyExpression); } /** @@ -342,7 +304,7 @@ public class TapestryInternalUtils private static String replace(String input, Pattern pattern, String replacement) { - return pattern.matcher(input).replaceAll(replacement); + return BeanModelUtils.replace(input, pattern, replacement); } /** http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/d54315f6/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 e9e7806..a40f984 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,16 +17,16 @@ 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.plastic.PlasticInternalUtils; import org.apache.tapestry5.ioc.*; import org.apache.tapestry5.ioc.annotations.*; import org.apache.tapestry5.ioc.def.*; -import org.apache.tapestry5.ioc.internal.NullAnnotationProvider; import org.apache.tapestry5.ioc.internal.ServiceDefImpl; import org.apache.tapestry5.ioc.services.Coercion; -import org.apache.tapestry5.ioc.services.PlasticProxyFactory; import org.apache.tapestry5.ioc.util.ExceptionUtils; import org.apache.tapestry5.plastic.PlasticUtils; +import org.apache.tapestry5.ioc.services.PlasticProxyFactory; import org.slf4j.Logger; import javax.annotation.PostConstruct; @@ -56,18 +56,6 @@ public class InternalUtils public static final boolean SERVICE_CLASS_RELOADING_ENABLED = Boolean.parseBoolean(System.getProperty( IOCConstants.SERVICE_CLASS_RELOADING_ENABLED, "true")); - - /** - * Pattern used to eliminate leading and trailing underscores and dollar signs. - */ - private static final Pattern NAME_PATTERN = Pattern.compile("^[_|$]*([\\p{javaJavaIdentifierPart}]+?)[_|$]*$", - Pattern.CASE_INSENSITIVE); - - /** - * @since 5.3 - */ - public static AnnotationProvider NULL_ANNOTATION_PROVIDER = new NullAnnotationProvider(); - /** * Converts a method to a user presentable string using a {@link PlasticProxyFactory} to obtain a {@link Location} * (where possible). {@link #asString(Method)} is used under the covers, to present a detailed, but not excessive, @@ -92,27 +80,11 @@ public class InternalUtils * * @param method * @return short string representation + * @deprecated use {@link InternalStringUtils#asString(Method)} instead. */ public static String asString(Method method) { - StringBuilder buffer = new StringBuilder(); - - buffer.append(method.getDeclaringClass().getName()); - buffer.append("."); - buffer.append(method.getName()); - buffer.append("("); - - for (int i = 0; i < method.getParameterTypes().length; i++) - { - if (i > 0) - buffer.append(", "); - - String name = method.getParameterTypes()[i].getSimpleName(); - - buffer.append(name); - } - - return buffer.append(")").toString(); + return InternalStringUtils.asString(method); } /** @@ -131,16 +103,11 @@ public class InternalUtils /** * Strips leading "_" and "$" and trailing "_" from the name. + * @deprecated use {@link InternalStringUtils#stripMemberName(String)} instead. */ public static String stripMemberName(String memberName) { - assert InternalUtils.isNonBlank(memberName); - Matcher matcher = NAME_PATTERN.matcher(memberName); - - if (!matcher.matches()) - throw new IllegalArgumentException(String.format("Input '%s' is not a valid Java identifier.", memberName)); - - return matcher.group(1); + return InternalStringUtils.stripMemberName(memberName); } /** @@ -425,10 +392,11 @@ 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 join(elements, ", "); + return InternalStringUtils.join(elements); } /** @@ -439,39 +407,11 @@ 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) { - switch (elements.size()) - { - case 0: - return ""; - - case 1: - return elements.get(0).toString(); - - default: - - StringBuilder buffer = new StringBuilder(); - boolean first = true; - - for (Object o : elements) - { - if (!first) - buffer.append(separator); - - String string = String.valueOf(o); - - if (string.equals("")) - string = "(blank)"; - - buffer.append(string); - - first = false; - } - - return buffer.toString(); - } + return InternalStringUtils.join(elements, separator); } /** @@ -479,29 +419,21 @@ 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) { - if (elements == null || elements.isEmpty()) - return "(none)"; - - List<String> list = CollectionFactory.newList(); - - for (Object o : elements) - list.add(String.valueOf(o)); - - Collections.sort(list); - - return join(list); + return InternalStringUtils.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 input == null || input.length() == 0 || input.trim().length() == 0; + return InternalStringUtils.isBlank(input); } /** @@ -518,20 +450,21 @@ public class InternalUtils return false; } + /** + * @deprecated use {@link InternalStringUtils#isNonBlank(String)} instead. + */ public static boolean isNonBlank(String input) { - return !isBlank(input); + return InternalStringUtils.isNonBlank(input); } /** * Capitalizes a string, converting the first character to uppercase. + * @deprecated use {@link InternalStringUtils#capitalize(String)} instead. */ public static String capitalize(String input) { - if (input.length() == 0) - return input; - - return input.substring(0, 1).toUpperCase() + input.substring(1); + return InternalStringUtils.capitalize(input); } /** @@ -639,10 +572,11 @@ 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 input.contains("${"); + return InternalStringUtils.containsSymbols(input); } /** @@ -650,16 +584,11 @@ 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) { - assert InternalUtils.isNonBlank(input); - int dotx = input.lastIndexOf('.'); - - if (dotx < 0) - return input; - - return input.substring(dotx + 1); + return InternalStringUtils.lastTerm(input); } /** @@ -848,18 +777,9 @@ public class InternalUtils */ 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)); - } - }; + return BeanModelUtils.toAnnotationProvider(element); } - ; - /** * @since 5.3 */ @@ -1484,17 +1404,7 @@ public class InternalUtils 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); - } - }; + return BeanModelUtils.toAnnotationProvider(element); } public static <T> ObjectCreator<T> createConstructorConstructionPlan(final OperationTracker tracker, final ObjectLocator locator,