Permalink
Browse files

Merge branch 'modularization'

Conflicts:
	grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/WebUtils.java
  • Loading branch information...
2 parents b684c0d + 65e5940 commit 6032036d1bc9d395ad7d9ebda6537dce00ba1baa @graemerocher graemerocher committed Mar 7, 2014
Showing with 796 additions and 441 deletions.
  1. +3 −1 grails-async/build.gradle
  2. +19 −0 grails-bootstrap/src/main/groovy/grails/util/Environment.java
  3. +3 −0 grails-bootstrap/src/main/groovy/org/codehaus/groovy/grails/cli/fork/ForkedGrailsProcess.groovy
  4. +83 −0 grails-bootstrap/src/main/groovy/org/codehaus/groovy/grails/io/support/GrailsIOUtils.groovy
  5. +1 −0 grails-bootstrap/src/main/groovy/org/codehaus/groovy/grails/resolve/GrailsCoreDependencies.java
  6. +3 −3 grails-bootstrap/src/test/groovy/org/codehaus/groovy/grails/resolve/IvyDependencyManagerTests.groovy
  7. +9 −6 grails-core/build.gradle
  8. +7 −5 grails-core/src/main/groovy/org/codehaus/groovy/grails/commons/DefaultGrailsApplication.java
  9. +7 −7 grails-core/src/main/groovy/org/codehaus/groovy/grails/commons/GrailsArrayUtils.groovy
  10. +2 −2 grails-core/src/main/groovy/org/codehaus/groovy/grails/commons/GrailsClassUtils.java
  11. +83 −1 grails-core/src/main/groovy/org/codehaus/groovy/grails/commons/GrailsStringUtils.groovy
  12. +111 −0 grails-core/src/main/groovy/org/codehaus/groovy/grails/core/io/support/GrailsFactoriesLoader.groovy
  13. +2 −3 grails-core/src/main/groovy/org/codehaus/groovy/grails/plugins/AbstractGrailsPluginManager.java
  14. +2 −2 grails-core/src/main/groovy/org/codehaus/groovy/grails/plugins/DefaultGrailsPlugin.java
  15. +6 −5 grails-core/src/main/groovy/org/codehaus/groovy/grails/plugins/GrailsPluginManagerFactoryBean.java
  16. +34 −0 grails-core/src/main/groovy/org/codehaus/groovy/grails/plugins/PluginManagerLoader.groovy
  17. +2 −4 grails-core/src/main/groovy/org/codehaus/groovy/grails/validation/DefaultConstraintEvaluator.java
  18. +0 −56 .../groovy/org/codehaus/groovy/grails/validation/metaclass/ConstraintsEvaluatingDynamicProperty.java
  19. +13 −0 grails-core/src/test/groovy/org/codehaus/groovy/grails/commons/GrailsStringUtilsSpec.groovy
  20. +1 −0 grails-plugin-codecs/build.gradle
  21. +2 −2 grails-plugin-codecs/src/main/groovy/org/codehaus/groovy/grails/plugins/codecs/JSONEncoder.java
  22. +9 −10 ...gin-controllers/src/main/groovy/org/codehaus/groovy/grails/web/metaclass/RenderDynamicMethod.java
  23. +4 −31 grails-plugin-converters/src/main/groovy/grails/converters/JSON.java
  24. +1 −2 ...lugin-converters/src/main/groovy/org/codehaus/groovy/grails/web/converters/AbstractConverter.java
  25. +2 −2 ...plugin-gsp/src/main/groovy/org/codehaus/groovy/grails/plugins/web/taglib/ApplicationTagLib.groovy
  26. +4 −4 grails-plugin-i18n/src/main/groovy/org/codehaus/groovy/grails/plugins/i18n/I18nGrailsPlugin.groovy
  27. +2 −2 grails-plugin-url-mappings/src/main/groovy/grails/test/GrailsUrlMappingsTestCase.groovy
  28. +3 −3 ...plugin-url-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultUrlCreator.java
  29. +1 −2 ...in-url-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultUrlMappingData.java
  30. +2 −2 ...l-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultUrlMappingEvaluator.java
  31. +5 −5 ...s-plugin-url-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/RegexUrlMapping.java
  32. +3 −5 ...url-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/filter/UrlMappingsFilter.java
  33. +12 −0 grails-project-api/build.gradle
  34. +1 −1 ...ct-api}/src/main/groovy/org/codehaus/groovy/grails/cli/agent/GrailsPluginManagerReloadPlugin.java
  35. +40 −0 grails-project-api/src/main/groovy/org/codehaus/groovy/grails/compiler/GrailsProjectCompiler.groovy
  36. +33 −0 grails-project-api/src/main/groovy/org/codehaus/groovy/grails/compiler/GrailsProjectWatcher.java
  37. 0 {grails-core → grails-project-api}/src/main/groovy/org/codehaus/groovy/grails/compiler/Grailsc.java
  38. +3 −1 ...ect-api/src/main/groovy/org/codehaus/groovy/grails/project}/compiler/GrailsProjectCompiler.groovy
  39. +8 −25 ...roject-api/src/main/groovy/org/codehaus/groovy/grails/project}/compiler/GrailsProjectWatcher.java
  40. 0 ...ject-api}/src/main/groovy/org/codehaus/groovy/grails/project/container/GrailsProjectRunner.groovy
  41. 0 ...ject-api}/src/main/groovy/org/codehaus/groovy/grails/project/creation/GrailsProjectCleaner.groovy
  42. +1 −1 ...project-api}/src/main/groovy/org/codehaus/groovy/grails/project/loader/GrailsProjectLoader.groovy
  43. +1 −1 ...ct-api}/src/main/groovy/org/codehaus/groovy/grails/project/packaging/GrailsProjectPackager.groovy
  44. 0 ...-api}/src/main/groovy/org/codehaus/groovy/grails/project/packaging/GrailsProjectWarCreator.groovy
  45. +9 −1 ...-api}/src/main/groovy/org/codehaus/groovy/grails/project/plugins/GrailsProjectPluginLoader.groovy
  46. +2 −2 ...ls-project-api}/src/main/groovy/org/codehaus/groovy/grails/project/ui/GrailsProjectConsole.groovy
  47. +1 −3 ...-api/src/test/groovy/org/codehaus/groovy/grails/project}/compiler/GrailsProjectWatcherSpec.groovy
  48. +2 −1 grails-scripts/build.gradle
  49. +0 −1 ...-test-suite-uber/src/test/groovy/org/codehaus/groovy/grails/plugins/GrailsPluginUtilsTests.groovy
  50. +11 −12 ...t-suite-uber/src/test/groovy/org/codehaus/groovy/grails/plugins/i18n/I18nGrailsPluginTests.groovy
  51. +2 −2 grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/pages/ParseTests.java
  52. +1 −0 grails-test/build.gradle
  53. +1 −1 grails-test/src/main/groovy/org/codehaus/groovy/grails/test/runner/GrailsProjectTestCompiler.groovy
  54. +1 −1 grails-test/src/main/groovy/org/codehaus/groovy/grails/test/runner/GrailsProjectTestRunner.groovy
  55. +1 −2 ...rc/main/groovy/org/codehaus/groovy/grails/test/runner/phase/IntegrationTestPhaseConfigurer.groovy
  56. +0 −2 grails-web/build.gradle
  57. +2 −2 grails-web/src/main/groovy/grails/util/GrailsWebUtil.java
  58. +29 −29 ...re → grails-web}/src/main/groovy/org/codehaus/groovy/grails/commons/BootstrapArtefactHandler.java
  59. 0 ...→ grails-web}/src/main/groovy/org/codehaus/groovy/grails/commons/DefaultGrailsBootstrapClass.java
  60. 0 ...s-core → grails-web}/src/main/groovy/org/codehaus/groovy/grails/commons/GrailsBootstrapClass.java
  61. +2 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/support/ResourceAwareTemplateEngine.java
  62. +2 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/binding/CurrencyEditor.java
  63. +8 −15 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/binding/GrailsDataBinder.java
  64. +7 −7 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/binding/StructuredDateEditor.java
  65. +3 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/binding/TimeZoneEditor.java
  66. +2 −6 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/errors/GrailsWrappedRuntimeException.java
  67. +1 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/json/JSONArray.java
  68. +2 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/AbstractUrlMappingInfo.java
  69. +3 −3 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/UrlCreatorCache.java
  70. +27 −29 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/pages/DefaultGroovyPagesUriService.java
  71. +3 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/pages/GSPWriter.java
  72. +3 −3 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/pages/GroovyPageMetaInfo.java
  73. +8 −7 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/pages/GroovyPageParser.java
  74. +2 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/pages/GroovyPageResourceLoader.java
  75. +2 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/pages/GroovyPagesServlet.java
  76. +6 −6 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/pages/GroovyPagesTemplateRenderer.java
  77. +27 −15 ...oovy/org/codehaus/groovy/grails/web/pages/discovery/CachingGrailsConventionGroovyPageLocator.java
  78. +2 −0 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/servlet/GrailsDispatcherServlet.java
  79. +3 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/servlet/mvc/GrailsParameterMap.java
  80. +19 −19 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/sitemesh/GroovyPageLayoutFinder.java
  81. +3 −3 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/taglib/GroovyCollectTag.java
  82. +2 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/taglib/GroovyConditionalTag.java
  83. +3 −3 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/taglib/GroovyDefTag.java
  84. +2 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/taglib/GroovyEachTag.java
  85. +3 −3 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/taglib/GroovyFindAllTag.java
  86. +3 −3 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/taglib/GroovyGrepTag.java
  87. +6 −6 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/taglib/GroovySyntaxTag.java
  88. +2 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/taglib/GroovyWhileTag.java
  89. +3 −3 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/taglib/jsp/JspRenderInputTag.java
  90. +6 −6 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/AbstractTypeConvertingMap.java
  91. +16 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/GrailsPrintWriterAdapter.java
  92. +3 −2 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/StreamByteBuffer.java
  93. +3 −7 grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/WebUtils.java
  94. +1 −0 grails-web/src/main/resources/META-INF/grails.factories
  95. +1 −1 ...ls-web}/src/test/groovy/org/codehaus/groovy/grails/web/servlet/mvc/GrailsParameterMapTests.groovy
  96. +15 −14 ...uber → grails-web}/src/test/groovy/org/codehaus/groovy/grails/web/util/StreamCharBufferTests.java
  97. +1 −1 scripts/_GrailsClasspath.groovy
  98. +1 −0 settings.gradle
@@ -1,5 +1,7 @@
dependencies {
- compile 'org.codehaus.gpars:gpars:1.1.0'
+ compile 'org.codehaus.gpars:gpars:1.1.0', {
+ exclude group:'org.multiverse', module:'multiverse-core'
+ }
}
eclipse {
@@ -22,6 +22,7 @@
import java.util.Locale;
import java.util.Map;
+import org.codehaus.groovy.control.MultipleCompilationErrorsException;
import org.codehaus.groovy.runtime.DefaultGroovyMethods;
/**
@@ -93,12 +94,30 @@
private static Holder<Environment> cachedCurrentEnvironment = new Holder<Environment>("Environment");
private static final boolean cachedHasGrailsHome = System.getProperty("grails.home") != null;
private static boolean initializingState = false;
+ public static Throwable currentReloadError = null;
+ public static MultipleCompilationErrorsException currentCompilationError = null;
private String name;
Environment() {
initialize();
}
+ public static void setCurrentReloadError(Throwable currentReloadError) {
+ Environment.currentReloadError = currentReloadError;
+ }
+
+ public static MultipleCompilationErrorsException getCurrentCompilationError() {
+ return currentCompilationError;
+ }
+
+ public static Throwable getCurrentReloadError() {
+ return currentReloadError;
+ }
+
+ public static boolean isReloadInProgress() {
+ return Boolean.getBoolean("grails.reloading.in.progress");
+ }
+
private void initialize() {
name = toString().toLowerCase(Locale.ENGLISH);
}
@@ -847,7 +847,10 @@ class ExecutionContext implements Serializable {
}
buildDependencies = isolatedBuildDependencies
+
runtimeDependencies = new ArrayList<>(settings.runtimeDependencies)
+ def projectApiJar = settings.buildDependencies.find { File f -> f.name.contains('grails-project-api')}
+ runtimeDependencies.add projectApiJar
runtimeDependencies.addAll settings.pluginRuntimeDependencies
runtimeDependencies.addAll settings.applicationJars
providedDependencies = new ArrayList<>(settings.providedDependencies)
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2002-2013 the original author or authors.
+ *
+ * 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.codehaus.groovy.grails.io.support
+
+import groovy.transform.CompileStatic
+
+/**
+ *
+ * @author Graeme Rocher
+ * @since 2.4
+ */
+@CompileStatic
+class GrailsIOUtils extends IOUtils{
+
+ /**
+ * Gracefully opens a stream for a file, throwing exceptions where appropriate. Based off the commons-io method
+ *
+ * @param file The file
+ * @return The stream
+ */
+ static BufferedInputStream openStream(File file) {
+ if(!file.exists()) {
+ throw new FileNotFoundException("File $file does not exist")
+ }
+ else {
+ if ( file.directory ) {
+ throw new IOException("File $file exists but is a directory")
+ }
+ else if ( !file.canRead() ) {
+ throw new IOException("File $file cannot be read")
+ }
+ else {
+ file.newInputStream()
+ }
+ }
+ }
+
+ /**
+ * Convert a reader to a String, reading the data from the reader
+ * @param reader The reader
+ * @return The string
+ */
+ static String toString(Reader reader) {
+ def writer = new StringWriter()
+ copy reader, writer
+ writer.toString()
+ }
+
+ /**
+ * Convert a stream to a String, reading the data from the stream
+ * @param stream The stream
+ * @return The string
+ */
+ static String toString(InputStream stream, String encoding = null) {
+ def writer = new StringWriter()
+ copy stream, writer, encoding
+ writer.toString()
+ }
+
+ /**
+ * Copy an InputStream to the given writer with the given encoding
+ * @param input The input
+ * @param output The writer
+ * @param encoding The encoding
+ */
+ static void copy(InputStream input, Writer output, String encoding = null) {
+ def reader = encoding ? new InputStreamReader(input) : new InputStreamReader(input)
+ copy(reader, output)
+ }
+}
@@ -63,6 +63,7 @@ public GrailsCoreDependencies(String grailsVersion, String servletVersion, boole
buildDependencies = Arrays.asList(
new Dependency("xalan","serializer", "2.7.1", true, "xml-apis:xml-apis"),
new Dependency("org.grails", "grails-bootstrap", grailsVersion, true ),
+ new Dependency("org.grails", "grails-project-api", grailsVersion, true ),
new Dependency("org.grails", "grails-scripts", grailsVersion, true )
);
@@ -680,7 +680,7 @@ class IvyDependencyManagerTests extends GroovyTestCase {
assertEquals 10, manager.dependencyDescriptors.findAll { it.scope == 'compile'}.size()
assertEquals 3, manager.dependencyDescriptors.findAll { it.scope == 'runtime'}.size()
assertEquals 3, manager.dependencyDescriptors.findAll { it.scope == 'test'}.size()
- assertEquals 3, manager.dependencyDescriptors.findAll { it.scope == 'build'}.size()
+ assertEquals 4, manager.dependencyDescriptors.findAll { it.scope == 'build'}.size()
assertEquals 1, manager.dependencyDescriptors.findAll { it.scope == 'provided'}.size()
assertEquals 1, manager.dependencyDescriptors.findAll { it.scope == 'docs'}.size()
}
@@ -703,7 +703,7 @@ class IvyDependencyManagerTests extends GroovyTestCase {
assertEquals 0, manager.dependencyDescriptors.findAll { it.scope == 'compile'}.size()
assertEquals 0, manager.dependencyDescriptors.findAll { it.scope == 'runtime'}.size()
assertEquals 2, manager.dependencyDescriptors.findAll { it.scope == 'test'}.size()
- assertEquals 3, manager.dependencyDescriptors.findAll { it.scope == 'build'}.size()
+ assertEquals 4, manager.dependencyDescriptors.findAll { it.scope == 'build'}.size()
assertEquals 14, manager.dependencyDescriptors.findAll { it.scope == 'provided'}.size()
assertEquals 1, manager.dependencyDescriptors.findAll { it.scope == 'docs'}.size()
@@ -718,7 +718,7 @@ class IvyDependencyManagerTests extends GroovyTestCase {
assertEquals 10, manager.dependencyDescriptors.findAll { it.scope == 'compile'}.size()
assertEquals 3, manager.dependencyDescriptors.findAll { it.scope == 'runtime'}.size()
assertEquals 2, manager.dependencyDescriptors.findAll { it.scope == 'test'}.size()
- assertEquals 3, manager.dependencyDescriptors.findAll { it.scope == 'build'}.size()
+ assertEquals 4, manager.dependencyDescriptors.findAll { it.scope == 'build'}.size()
assertEquals 1, manager.dependencyDescriptors.findAll { it.scope == 'provided'}.size()
assertEquals 1, manager.dependencyDescriptors.findAll { it.scope == 'docs'}.size()
}
@@ -68,18 +68,21 @@ dependencies {
exclude group:"org.codehaus.gant", module:"gant_groovy1.8"
}
+ compile project(":grails-spring"), {
+ exclude group:'org.springframework', module:'spring-tx'
+ exclude group:'org.springframework', module:'spring-web'
+ exclude group:'org.grails', module:'grails-bootstrap'
+ }
+
+ // These dependencies are not required, but due to a Groovy compiler bug they are loaded by Groovy and hence
+ // have to be on the path for compilation even though they shouldn't be
optional "org.apache.ant:ant:${antVersion}"
optional "jline:jline:$jlineVersion"
optional "org.fusesource.jansi:jansi:$jansiVersion"
-
optional("org.codehaus.gant:gant_groovy1.8:${gantVersion}") {
exclude group:'commons-cli', module:'commons-cli'
}
- compile project(":grails-spring"), {
- exclude group:'org.springframework', module:'spring-tx'
- exclude group:'org.springframework', module:'spring-web'
- exclude group:'org.grails', module:'grails-bootstrap'
- }
+
}
sourceSets {
@@ -38,6 +38,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.groovy.grails.commons.cfg.ConfigurationHelper;
+import org.codehaus.groovy.grails.core.io.support.GrailsFactoriesLoader;
import org.codehaus.groovy.grails.exceptions.GrailsConfigurationException;
import org.codehaus.groovy.grails.plugins.GrailsPluginManager;
import org.codehaus.groovy.grails.plugins.support.aware.GrailsApplicationAwareBeanPostProcessor;
@@ -187,11 +188,6 @@ protected void initArtefactHandlers() {
registerArtefactHandler(tagLibArtefactHandler);
}
- final BootstrapArtefactHandler bootstrapArtefactHandler = new BootstrapArtefactHandler();
- if (!hasArtefactHandler(bootstrapArtefactHandler.getType())) {
- registerArtefactHandler(bootstrapArtefactHandler);
- }
-
final CodecArtefactHandler codecArtefactHandler = new CodecArtefactHandler();
if (!hasArtefactHandler(codecArtefactHandler.getType())) {
registerArtefactHandler(codecArtefactHandler);
@@ -202,6 +198,12 @@ protected void initArtefactHandlers() {
registerArtefactHandler(urlMappingsArtefactHandler);
}
+ List<ArtefactHandler> additionalArtefactHandlers = GrailsFactoriesLoader.loadFactories(ArtefactHandler.class, getClassLoader());
+
+ for (ArtefactHandler artefactHandler : additionalArtefactHandlers) {
+ registerArtefactHandler(artefactHandler);
+ }
+
updateArtefactHandlers();
}
@@ -31,31 +31,31 @@ import org.springframework.util.ObjectUtils
@CompileStatic
abstract class GrailsArrayUtils {
- static String toString(Object... array) {
+ static String toString(Object[] array) {
ObjectUtils.nullSafeToString(array)
}
- static String toString(int... array) {
+ static String toString(int[] array) {
ObjectUtils.nullSafeToString(array)
}
- static String toString(boolean... array) {
+ static String toString(boolean[] array) {
ObjectUtils.nullSafeToString(array)
}
- static String toString(float... array) {
+ static String toString(float[] array) {
ObjectUtils.nullSafeToString(array)
}
- static String toString(short... array) {
+ static String toString(short[] array) {
ObjectUtils.nullSafeToString(array)
}
- static String toString(byte... array) {
+ static String toString(byte[] array) {
ObjectUtils.nullSafeToString(array)
}
- static String toString(char... array) {
+ static String toString(char[] array) {
ObjectUtils.nullSafeToString(array)
}
@@ -744,7 +744,7 @@ public static boolean isGroovyAssignableFrom(Class<?> leftType, Class<?> rightTy
*/
@SuppressWarnings("rawtypes")
public static boolean isStaticProperty(Class clazz, String propertyName) {
- Method getter = BeanUtils.findDeclaredMethod(clazz, getGetterName(propertyName), null);
+ Method getter = BeanUtils.findDeclaredMethod(clazz, getGetterName(propertyName), (Class[])null);
if (getter != null) {
return isPublicStatic(getter);
}
@@ -817,7 +817,7 @@ public static Object getStaticFieldValue(Class<?> clazz, String name) {
* @return The value if there is one, or null if unset OR there is no such property
*/
public static Object getStaticPropertyValue(Class<?> clazz, String name) {
- Method getter = BeanUtils.findDeclaredMethod(clazz, getGetterName(name), null);
+ Method getter = BeanUtils.findDeclaredMethod(clazz, getGetterName(name), (Class[])null);
try {
if (getter != null) {
return getter.invoke(null);
Oops, something went wrong. Retry.

0 comments on commit 6032036

Please sign in to comment.