This is an automated email from the ASF dual-hosted git repository. jamesbognar pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push: new 2d753de Context API refactoring. 2d753de is described below commit 2d753de42f13eaaf2e8acb178af74d72bc1d0736 Author: JamesBognar <james.bog...@salesforce.com> AuthorDate: Sun Sep 19 10:15:10 2021 -0400 Context API refactoring. --- .../main/java/org/apache/juneau/BeanBuilder.java | 190 ++++++++++ .../java/org/apache/juneau/ContextProperties.java | 7 +- .../org/apache/juneau/assertions/Assertion.java | 9 +- .../juneau/assertions/FluentObjectAssertion.java | 10 + .../apache/juneau/cp/BeanCreateMethodFinder.java | 4 +- .../java/org/apache/juneau/cp/BeanCreator.java | 326 ++++++++++++++++ .../main/java/org/apache/juneau/cp/BeanStore.java | 261 ++++--------- .../main/java/org/apache/juneau/cp/FileFinder.java | 95 ++--- .../main/java/org/apache/juneau/cp/Messages.java | 131 ++++--- .../org/apache/juneau/encoders/EncoderGroup.java | 95 ++--- .../org/apache/juneau/http/header/HeaderList.java | 62 +-- .../java/org/apache/juneau/http/part/PartList.java | 55 ++- .../juneau/httppart/bean/RequestBeanMeta.java | 4 +- .../httppart/bean/RequestBeanPropertyMeta.java | 4 +- .../org/apache/juneau/mstat/MethodExecStats.java | 82 ++-- .../org/apache/juneau/mstat/MethodExecStore.java | 102 ++--- .../apache/juneau/mstat/ThrownStatsBuilder.java | 2 +- .../java/org/apache/juneau/mstat/ThrownStore.java | 104 ++--- .../org/apache/juneau/reflect/ExecutableInfo.java | 14 +- .../java/org/apache/juneau/svl/VarResolver.java | 91 +++-- .../org/apache/juneau/rest/client/RestClient.java | 6 +- .../rest/client/remote/RemoteOperationArg.java | 2 +- .../org/apache/juneau/rest/BasicStaticFiles.java | 34 +- .../org/apache/juneau/rest/DebugEnablement.java | 3 +- .../apache/juneau/rest/ResponseProcessorList.java | 2 +- .../java/org/apache/juneau/rest/RestChildren.java | 5 +- .../java/org/apache/juneau/rest/RestContext.java | 8 +- .../org/apache/juneau/rest/RestContextBuilder.java | 13 +- .../org/apache/juneau/rest/RestConverterList.java | 2 +- .../java/org/apache/juneau/rest/RestGuardList.java | 2 +- .../org/apache/juneau/rest/RestMatcherList.java | 2 +- .../java/org/apache/juneau/rest/RestOpContext.java | 30 +- .../apache/juneau/rest/RestOpContextBuilder.java | 4 +- .../org/apache/juneau/rest/RestOperations.java | 3 +- .../java/org/apache/juneau/rest/StaticFiles.java | 127 +++++-- .../org/apache/juneau/rest/SwaggerProvider.java | 3 +- .../org/apache/juneau/rest/logging/RestLogger.java | 3 +- .../org/apache/juneau/cp/BeanCreator_Test.java | 419 +++++++++++++++++++++ .../java/org/apache/juneau/cp/BeanStore_Test.java | 373 +++--------------- .../apache/juneau/mstat/MethodExecStore_Test.java | 12 +- .../org/apache/juneau/mstat/ThrownStore_Test.java | 12 +- 41 files changed, 1652 insertions(+), 1061 deletions(-) diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanBuilder.java new file mode 100644 index 0000000..c12fcbb --- /dev/null +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanBuilder.java @@ -0,0 +1,190 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau; + +import static org.apache.juneau.internal.ExceptionUtils.*; +import static java.util.Optional.*; + +import java.util.*; + +import org.apache.juneau.cp.*; +import org.apache.juneau.internal.*; + +/** + * Base class for bean builders. + * + * @param <T> The bean type that the builder creates. + */ +public class BeanBuilder<T> { + + private Class<? extends T> type, defaultType; + private T impl; + private Object outer; + private BeanStore beanStore = BeanStore.INSTANCE; + + /** + * Constructor. + * + * @param defaultType The default bean type that this builder creates. + */ + protected BeanBuilder(Class<? extends T> defaultType) { + this.defaultType = type = defaultType; + } + + /** + * Copy constructor. + * + * @param copyFrom The bean store to copy from. + */ + protected BeanBuilder(BeanBuilder<T> copyFrom) { + type = copyFrom.type; + impl = copyFrom.impl; + outer = copyFrom.outer; + beanStore = copyFrom.beanStore; + } + + /** + * Creates a copy of this builder. + * + * @return A copy of this builder. + */ + public BeanBuilder<T> copy() { + return new BeanBuilder<>(this); + } + + /** + * Creates the bean. + * + * @return A new bean. + */ + public T build() { + if (impl != null) + return impl; + if (type == null || type == defaultType) + return buildDefault(); + return beanStore + .creator(type().orElseThrow(()->runtimeException("Type not specified."))) + .outer(outer) + .builder(this) + .run(); + } + + /** + * Creates the bean when the bean type is <jk>null</jk> or is the default value. + * + * @return A new bean. + */ + protected T buildDefault() { + return beanStore + .creator(type().orElseThrow(()->runtimeException("Type not specified."))) + .outer(outer) + .builder(this) + .run(); + } + + /** + * Overrides the bean type produced by the {@link #build()} method. + * + * <p> + * Use this method if you want to instantiated a bean subclass. + * + * @param value The setting value. + * @return This object. + */ + @FluentSetter + public BeanBuilder<T> type(Class<? extends T> value) { + type = value; + return this; + } + + /** + * Returns the implementation type specified via {@link #type(Class)}. + * + * @return The implementation type specified via {@link #type(Class)}. + */ + protected Optional<Class<? extends T>> type() { + return ofNullable(type); + } + + /** + * Overrides the bean returned by the {@link #build()} method. + * + * <p> + * Use this method if you want this builder to return an already-instantiated bean. + * + * @param value The setting value. + * @return This object. + */ + public BeanBuilder<T> impl(T value) { + this.impl = value; + return this; + } + + /** + * Returns the override bean specified via {@link #impl(Object)}. + * + * @return The override bean specified via {@link #impl(Object)}. + */ + protected Optional<T> impl() { + return ofNullable(impl); + } + + /** + * Specifies the outer bean context. + * + * <p> + * This should be the instance of the outer object such as the servlet object when constructing inner classes + * of the servlet class. + * + * @param value The setting value. + * @return This object. + */ + @FluentSetter + public BeanBuilder<T> outer(Object value) { + outer = value; + return this; + } + + /** + * Returns the outer bean context specified via {@link #outer(Object)}. + * + * @return The outer bean context specified via {@link #outer(Object)}. + */ + public Optional<Object> outer() { + return ofNullable(outer); + } + + /** + * The bean store to use for instantiating the bean. + * + * <p> + * The bean store can be used to inject beans into parameters of the constructor of the bean. + * + * @param value The setting value. + * @return This object. + */ + @FluentSetter + public BeanBuilder<T> beanStore(BeanStore value) { + beanStore = value; + return this; + } + + /** + * Returns the bean store specified via {@link #outer(Object)}. + * + * @return The bean store specified via {@link #outer(Object)}. + */ + public Optional<BeanStore> beanStore() { + return ofNullable(beanStore); + } +} diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextProperties.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextProperties.java index 6522d3f..eededa1 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextProperties.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextProperties.java @@ -918,11 +918,8 @@ public final class ContextProperties { if (ClassInfo.of(c).isParentOf(value.getClass())) return (T)value; try { - if (ClassInfo.of(value.getClass()).isChildOf(Class.class)) { - if (beanStore == null) - beanStore = BeanStore.INSTANCE; - return beanStore.createBean((Class<T>)value); - } + if (ClassInfo.of(value.getClass()).isChildOf(Class.class)) + return BeanCreator.create((Class<T>)value).store(beanStore).run(); } catch (ExecutableException e) { throw new ConfigException(e, "Could not create bean of type ''{0}''.", value); } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertion.java index fe2409f..a796f15 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertion.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertion.java @@ -221,7 +221,14 @@ public class Assertion { out.println(msg); if (throwable != null) { try { - throw BeanStore.create().build().addBean(Throwable.class, cause).addBean(String.class, msg).addBean(Object[].class,new Object[0]).createBean(throwable); + throw BeanStore + .create() + .build() + .addBean(Throwable.class, cause) + .addBean(String.class, msg) + .addBean(Object[].class,new Object[0]) + .creator(throwable) + .run(); } catch (ExecutableException e) { // If we couldn't create requested exception, just throw a RuntimeException. throw runtimeException(cause, msg); diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java index 3d303ef..b3ebb57 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java @@ -244,6 +244,16 @@ public class FluentObjectAssertion<T,R> extends FluentAssertion<R> { } /** + * Applies a transform on the inner object and returns a new inner object. + * + * @param function The function to apply. + * @return This object (for method chaining). + */ + public <T2> FluentObjectAssertion<T2,R> transform(Function<T,T2> function) { + return new FluentObjectAssertion<>(this, function.apply(orElse(null)), returns()); + } + + /** * Converts this assertion into an {@link FluentAnyAssertion} so that it can be converted to other assertion types. * * @return This object (for method chaining). diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java index d0dede0..73e35d0 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java @@ -25,7 +25,7 @@ import org.apache.juneau.reflect.*; /** * Used for finding methods on an object that take in arbitrary parameters and returns bean instances. * - * See {@link BeanStore#beanCreateMethodFinder(Class, Object)} for usage. + * See {@link BeanStore#createMethodFinder(Class, Object)} for usage. * * @param <T> The bean type being created. */ @@ -86,7 +86,7 @@ public class BeanCreateMethodFinder<T> { * This method can be called multiple times with different method names or required parameters until a match is found. * <br>Once a method is found, subsequent calls to this method will be no-ops. * - * See {@link BeanStore#beanCreateMethodFinder(Class, Object)} for usage. + * See {@link BeanStore#createMethodFinder(Class, Object)} for usage. * * @param methodName The method name. * @param requiredParams Optional required parameters. diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java new file mode 100644 index 0000000..4f7d0a8 --- /dev/null +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java @@ -0,0 +1,326 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.cp; + +import static java.util.stream.Collectors.*; +import static org.apache.juneau.reflect.ReflectFlags.*; + +import java.lang.annotation.*; +import java.util.*; +import java.util.function.*; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.collections.*; +import org.apache.juneau.reflect.*; + +/** + * Utility class for creating beans. + * + * @param <T> The bean type being created. + */ +public class BeanCreator<T> { + + private ClassInfo type; + private BeanStore store = BeanStore.INSTANCE; + private Object outer; + private Object builder; + private boolean findSingleton; + + /** + * Static creator. + * + * @param type The bean type being created. + * @return A new creator object. + */ + public static <T> BeanCreator<T> create(Class<T> type) { + return new BeanCreator<>(type); + } + + /** + * Constructor. + * + * @param type The bean type being created. + */ + protected BeanCreator(Class<T> type) { + this.type = ClassInfo.ofc(type); + } + + /** + * Allows you to specify a subclass of the specified bean type to create. + * + * @param value The value for this setting. + * @return This object. + */ + public BeanCreator<T> type(Class<?> value) { + if (value != null && ! type.inner().isAssignableFrom(value)) + throw new ExecutableException("Could not instantiate class of type {0} because it was not a subtype of the class: {1}.", type, value); + type = ClassInfo.ofc(value); + return this; + } + + /** + * Specifies a bean store for looking up matching parameters on constructors and static creator methods. + * + * @param value The value for this setting. + * @return This object. + */ + public BeanCreator<T> store(BeanStore value) { + if (value != null) + store = value; + return this; + } + + /** + * Specifies the outer "this" parameter to an inner class constructor. + * + * @param value The value for this setting. + * @return This object. + */ + public BeanCreator<T> outer(Object value) { + outer = value; + return this; + } + + /** + * Specifies a builder object for the bean type. + * + * @param value The value for this setting. + * @return This object. + */ + public BeanCreator<T> builder(Object value) { + builder = value; + return this; + } + + /** + * Specifies to look for the existence of a <c>getInstance()</c> method that returns a singleton. + * + * @return This object. + */ + public BeanCreator<T> findSingleton() { + findSingleton = true; + return this; + } + + /** + * Creates the bean. + * + * @return A new bean. + */ + public T run() { + if (type == null) + return null; + + String found = null; + + // Look for getInstance(). + if (builder == null || findSingleton) + for (MethodInfo m : type.getPublicMethods()) + if (isSingletonMethod(m)) + return m.invoke(null); + + if (builder == null) { + // Look for static creator methods. + + MethodInfo matchedCreator = null; + int matchedCreatorParams = -1; + + // Look for static creator method. + for (MethodInfo m : type.getPublicMethods()) { + if (isStaticCreateMethod(m)) { + found = "STATIC_CREATOR"; + if (hasAllParams(m.getParams())) { + if (m.getParamCount() > matchedCreatorParams) { + matchedCreatorParams = m.getParamCount(); + matchedCreator = m; + } + } + } + } + + if (matchedCreator != null) + return matchedCreator.invoke(null, getParams(matchedCreator.getParams())); + } + + if (type.isInterface()) + throw new ExecutableException("Could not instantiate class {0}: {1}.", type.getName(), "Class is an interface"); + + if (type.isAbstract()) + throw new ExecutableException("Could not instantiate class {0}: {1}.", type.getName(), "Class is abstract"); + + ConstructorInfo matchedConstructor = null; + int matchedConstructorParams = -1; + + // Look for public constructor. + for (ConstructorInfo cc : type.getPublicConstructors()) { + if (found == null) + found = "PUBLIC_CONSTRUCTOR"; + if (hasAllParams(cc.getParams())) { + if (cc.getParamCount() > matchedConstructorParams) { + matchedConstructorParams = cc.getParamCount(); + matchedConstructor = cc; + } + } + } + + // Look for protected constructor. + if (matchedConstructor == null) { + for (ConstructorInfo cc : type.getDeclaredConstructors()) { + if (cc.isProtected()) { + if (found == null) + found = "PROTECTED_CONSTRUCTOR"; + if (hasAllParams(cc.getParams())) { + if (cc.getParamCount() > matchedConstructorParams) { + matchedConstructorParams = cc.getParamCount(); + matchedConstructor = cc.accessible(); + } + } + } + } + } + + // Execute. + if (matchedConstructor != null) + return matchedConstructor.invoke(getParams(matchedConstructor.getParams())); + + if (builder == null) { + // Look for static-builder/protected-constructor pair. + for (ConstructorInfo cc2 : type.getDeclaredConstructors()) { + if (cc2.getParamCount() == 1 && cc2.isVisible(Visibility.PROTECTED)) { + Class<?> pt = cc2.getParam(0).getParameterType().inner(); + for (MethodInfo m : type.getPublicMethods()) { + if (isStaticCreateMethod(m, pt)) { + Object builder = m.invoke(null); + return cc2.accessible().invoke(builder); + } + } + } + } + } + + String msg = null; + if (found == null) { + msg = "No public/protected constructors found"; + } else if (found.equals("STATIC_CREATOR")) { + msg = "Static creator found but could not find prerequisites: " + type.getPublicMethods().stream().filter(x -> isStaticCreateMethod(x)).map(x -> getMissingParams(x.getParams())).sorted().collect(joining(" or ")); + } else if (found.equals("PUBLIC_CONSTRUCTOR")) { + msg = "Public constructor found but could not find prerequisites: " + type.getPublicConstructors().stream().map(x -> getMissingParams(x.getParams())).sorted().collect(joining(" or ")); + } else { + msg = "Protected constructor found but could not find prerequisites: " + type.getDeclaredConstructors().stream().filter(x -> x.isProtected()).map(x -> getMissingParams(x.getParams())).sorted().collect(joining(" or ")); + } + throw new ExecutableException("Could not instantiate class {0}: {1}.", type.getName(), msg); + } + + /** + * Converts this creator into a supplier. + * + * @return A supplier that returns the results of the {@link #run()} method. + */ + public Supplier<T> supplier() { + return ()->run(); + } + + private boolean hasAllParams(List<ParamInfo> params) { + loop: for (int i = 0; i < params.size(); i++) { + ParamInfo pi = params.get(i); + ClassInfo pt = pi.getParameterType(); + ClassInfo ptu = pt.unwrap(Optional.class); + if (i == 0 && ptu.isInstance(outer)) + continue loop; + if (pt.is(Optional.class)) + continue loop; + if (ptu.isInstance(builder)) + continue loop; + String beanName = findBeanName(pi); + if (beanName == null) + beanName = ptu.inner().getName(); + if (! store.hasBean(beanName)) + return false; + } + return true; + } + + private boolean isStaticCreateMethod(MethodInfo m) { + return isStaticCreateMethod(m, type.inner()); + } + + private boolean isStaticCreateMethod(MethodInfo m, Class<?> type) { + return m.isAll(STATIC, NOT_DEPRECATED) + && m.hasReturnType(type) + && (!m.hasAnnotation(BeanIgnore.class)) + && m.getSimpleName().equals("create"); + } + + private boolean isSingletonMethod(MethodInfo m) { + return m.isAll(STATIC, NOT_DEPRECATED) + && m.getParamCount() == 0 + && m.hasReturnType(type) + && (!m.hasAnnotation(BeanIgnore.class)) + && m.getSimpleName().equals("getInstance"); + } + + private Object[] getParams(List<ParamInfo> params) { + Object[] o = new Object[params.size()]; + for (int i = 0; i < params.size(); i++) { + ParamInfo pi = params.get(i); + ClassInfo pt = pi.getParameterType(); + ClassInfo ptu = pt.unwrap(Optional.class); + if (i == 0 && ptu.isInstance(outer)) + o[i] = outer; + else { + if (pt.isInstance(builder)) + o[i] = builder; + else { + String beanName = findBeanName(pi); + if (pt.is(Optional.class)) { + o[i] = store.getBean(beanName, ptu.inner()); + } else { + o[i] = store.getBean(beanName, ptu.inner()).get(); + } + } + } + } + return o; + } + + private String getMissingParams(List<ParamInfo> params) { + List<String> l = AList.create(); + loop: for (int i = 0; i < params.size(); i++) { + ParamInfo pi = params.get(i); + ClassInfo pt = pi.getParameterType(); + ClassInfo ptu = pt.unwrap(Optional.class); + if (i == 0 && ptu.isInstance(outer)) + continue loop; + if (pt.is(Optional.class)) + continue loop; + String beanName = findBeanName(pi); + if (beanName != null) { + if (! store.hasBean(beanName)) + l.add(beanName); + } else { + if (! store.hasBean(pt.inner())) + l.add(pt.inner().getSimpleName()); + } + } + return l.stream().sorted().collect(joining(",")); + } + + private String findBeanName(ParamInfo pi) { + Optional<Annotation> namedAnnotation = pi.getAnnotations(Annotation.class).stream().filter(x->x.annotationType().getSimpleName().equals("Named")).findFirst(); + if (namedAnnotation.isPresent()) + return AnnotationInfo.of((ClassInfo)null, namedAnnotation.get()).getValue(String.class, "value").orElse(null); + return null; + } + +} diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java index 0a032f3..161cf8b 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java @@ -12,20 +12,14 @@ // *************************************************************************************************************************** package org.apache.juneau.cp; -import static org.apache.juneau.internal.ClassUtils.*; import static org.apache.juneau.internal.ExceptionUtils.*; -import static org.apache.juneau.internal.StringUtils.*; -import static org.apache.juneau.reflect.ReflectFlags.*; import static java.util.Optional.*; - import java.lang.annotation.*; import java.util.*; import java.util.concurrent.*; import java.util.function.*; -import java.util.stream.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.collections.*; import org.apache.juneau.internal.*; import org.apache.juneau.reflect.*; @@ -89,18 +83,17 @@ public class BeanStore { /** * Builder class. */ - public static class Builder { + public static class Builder extends BeanBuilder<BeanStore> { - Class<? extends BeanStore> type = BeanStore.class; - BeanStore impl; - Object outer; BeanStore parent; boolean readOnly; /** * Constructor. */ - protected Builder() {} + protected Builder() { + super(BeanStore.class); + } /** * Copy constructor. @@ -108,40 +101,25 @@ public class BeanStore { * @param copyFrom The bean store to copy from. */ protected Builder(BeanStore copyFrom) { - type = copyFrom.getClass(); - outer = copyFrom.outer.orElse(null); + super(copyFrom.getClass()); parent = copyFrom.parent.orElse(null); readOnly = copyFrom.readOnly; } /** - * Create a new {@link BeanStore} using this builder. + * Copy constructor. * - * @return A new {@link BeanStore} + * @param copyFrom The bean store to copy from. */ - public BeanStore build() { - try { - if (impl != null) - return impl; - if (type == BeanStore.class) - return new BeanStore(this); - Class<? extends BeanStore> ic = isConcrete(type) ? type : BeanStore.class; - return new BeanStore().addBeans(Builder.class, this).createBean(ic); - } catch (ExecutableException e) { - throw runtimeException(e); - } + protected Builder(Builder copyFrom) { + super(copyFrom); + parent = copyFrom.parent; + readOnly = copyFrom.readOnly; } - /** - * Specifies a subclass of {@link BeanStore} to create when the {@link #build()} method is called. - * - * @param value The new value for this setting. - * @return This object. - */ - @FluentSetter - public Builder type(Class<? extends BeanStore> value) { - type = value; - return this; + @Override /* BeanBuilder */ + protected BeanStore buildDefault() { + return new BeanStore(this); } /** @@ -150,7 +128,7 @@ public class BeanStore { * <p> * Bean searches are performed recursively up this parent chain. * - * @param value The new value for this setting. + * @param value The setting value. * @return This object. */ @FluentSetter @@ -173,36 +151,38 @@ public class BeanStore { return this; } - /** - * Specifies the outer bean context. - * - * <p> - * Used when calling {@link BeanStore#createBean(Class)} on a non-static inner class. - * This should be the instance of the outer object such as the servlet object when constructing inner classes - * of the servlet class. - * - * @param value The new value for this setting. - * @return This object. - */ - @FluentSetter - public Builder outer(Object value) { - outer = value; + // <FluentSetters> + + @Override /* BeanBuilder */ + public Builder copy() { + return new Builder(this); + } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends BeanStore> value) { + super.type(value); return this; } - /** - * Specifies an implementation of a bean store. - * - * <p> - * Causes the {@link #build()} method to return a predefined bean instead of a new one. - * - * @param value The bean that this builder should return. - * @return This object. - */ + @Override /* BeanBuilder */ public Builder impl(BeanStore value) { - this.impl = value; + super.impl(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); return this; } + + // </FluentSetters> } //----------------------------------------------------------------------------------------------------------------- @@ -227,7 +207,7 @@ public class BeanStore { */ protected BeanStore(Builder builder) { this.parent = ofNullable(builder.parent); - this.outer = ofNullable(builder.outer); + this.outer = builder.outer(); this.readOnly = builder.readOnly; } @@ -381,6 +361,19 @@ public class BeanStore { } /** + * Removes a bean from this store. + * + * <p> + * This is equivalent to setting the bean type bean to <jk>null</jk>. + * + * @param c The bean type being removed. + * @return This object. + */ + public BeanStore removeBean(Class<?> c) { + return addBean(c.getName(), null); + } + + /** * Returns <jk>true</jk> if this factory contains the specified bean type instance. * * @param c The bean type to check. @@ -405,139 +398,13 @@ public class BeanStore { } /** - * Creates a bean of the specified type. + * Instantiates a bean creator. * - * @param <T> The bean type to create. - * @param c The bean type to create. Can be <jk>null</jk>. - * @return A newly-created bean, or <jk>null</jk> if the type was <jk>null</jk>. - * @throws ExecutableException If bean could not be created. - */ - public <T> T createBean(Class<T> c) throws ExecutableException { - - if (c == null) - return null; - - Optional<T> o = getBean(c); - if (o.isPresent()) - return o.get(); - - ClassInfo ci = ClassInfo.of(c); - - Supplier<String> msg = null; - - MethodInfo matchedCreator = null; - int matchedCreatorParams = -1; - - for (MethodInfo m : ci.getPublicMethods()) { - - if (m.isAll(STATIC, NOT_DEPRECATED) && m.hasReturnType(c) && (!m.hasAnnotation(BeanIgnore.class))) { - String n = m.getSimpleName(); - if (isOneOf(n, "create","getInstance")) { - List<ClassInfo> missing = getMissingParamTypes(m.getParams()); - if (missing.isEmpty()) { - if (m.getParamCount() > matchedCreatorParams) { - matchedCreatorParams = m.getParamCount(); - matchedCreator = m; - } - } else { - msg = ()-> "Static creator found but could not find prerequisites: " + missing.stream().map(x->x.getSimpleName()).collect(Collectors.joining(",")); - } - } - } - } - - if (matchedCreator != null) - return matchedCreator.invoke(null, getParams(matchedCreator.getParams())); - - if (ci.isInterface()) - throw new ExecutableException("Could not instantiate class {0}: {1}.", c.getName(), msg != null ? msg.get() : "Class is an interface"); - if (ci.isAbstract()) - throw new ExecutableException("Could not instantiate class {0}: {1}.", c.getName(), msg != null ? msg.get() : "Class is abstract"); - - ConstructorInfo matchedConstructor = null; - int matchedConstructorParams = -1; - - for (ConstructorInfo cc : ci.getPublicConstructors()) { - List<ClassInfo> missing = getMissingParamTypes(cc.getParams()); - if (missing.isEmpty()) { - if (cc.getParamCount() > matchedConstructorParams) { - matchedConstructorParams = cc.getParamCount(); - matchedConstructor = cc; - } - } else { - msg = ()-> "Public constructor found but could not find prerequisites: " + missing.stream().map(x->x.getSimpleName()).collect(Collectors.joining(",")); - } - } - - if (matchedConstructor == null) { - for (ConstructorInfo cc : ci.getDeclaredConstructors()) { - if (cc.isProtected()) { - List<ClassInfo> missing = getMissingParamTypes(cc.getParams()); - if (missing.isEmpty()) { - if (cc.getParamCount() > matchedConstructorParams) { - matchedConstructorParams = cc.getParamCount(); - matchedConstructor = cc.accessible(); - } - } else { - msg = ()-> "Protected constructor found but could not find prerequisites: " + missing.stream().map(x->x.getSimpleName()).collect(Collectors.joining(",")); - } - } - } - } - - // Look for static-builder/protected-constructor pair. - if (matchedConstructor == null) { - for (ConstructorInfo cc2 : ci.getDeclaredConstructors()) { - if (cc2.getParamCount() == 1 && cc2.isVisible(Visibility.PROTECTED)) { - Class<?> pt = cc2.getParam(0).getParameterType().inner(); - for (MethodInfo m : ci.getPublicMethods()) { - if (m.isAll(STATIC, NOT_DEPRECATED) && m.hasReturnType(pt) && (!m.hasAnnotation(BeanIgnore.class))) { - Object builder = m.invoke(null); - return cc2.accessible().invoke(builder); - } - } - } - } - } - - if (matchedConstructor != null) - return matchedConstructor.invoke(getParams(matchedConstructor.getParams())); - - if (msg == null) - msg = () -> "Public constructor or creator not found"; - - throw new ExecutableException("Could not instantiate class {0}: {1}.", c.getName(), msg.get()); - } - - /** - * Same as {@link #createBean(Class)} but allows you to validate that the specified type is of the specified parent class. - * - * @param <T> The bean type to create. * @param c The bean type to create. - * @param type The bean subtype to create. - * @return A newly-created bean. - * @throws ExecutableException If bean could not be created. + * @return A new bean creator. */ - public <T> T createBean(Class<T> c, Class<? extends T> type) { - if (type != null && ! c.isAssignableFrom(type)) - throw new ExecutableException("Could not instantiate class of type {0} because it was not a subtype of the class: {1}.", c.getName(), type); - return createBean(type); - } - - /** - * Same as {@link #createBean(Class)} but returns the bean creation wrapped in a supplier. - * - * @param c The bean type to create. - * @return A supplier for the newly-created bean. - */ - public <T> Supplier<T> createBeanSupplier(Class<T> c) { - return () -> { - try { - return createBean(c); - } catch (ExecutableException e) { - throw runtimeException(e); - } - }; + public <T> BeanCreator<T> creator(Class<T> c) { + return new BeanCreator<>(c).store(this).outer(outer.orElse(null)); } /** @@ -578,7 +445,7 @@ public class BeanStore { * @param resource The class containing the bean creator method. * @return The created bean or the default value if method could not be found. */ - public <T> BeanCreateMethodFinder<T> beanCreateMethodFinder(Class<T> c, Object resource) { + public <T> BeanCreateMethodFinder<T> createMethodFinder(Class<T> c, Object resource) { return new BeanCreateMethodFinder<>(c, resource, this); } @@ -589,7 +456,7 @@ public class BeanStore { * @param resourceClass The class containing the bean creator method. * @return The created bean or the default value if method could not be found. */ - public <T> BeanCreateMethodFinder<T> beanCreateMethodFinder(Class<T> c, Class<?> resourceClass) { + public <T> BeanCreateMethodFinder<T> createMethodFinder(Class<T> c, Class<?> resourceClass) { return new BeanCreateMethodFinder<>(c, resourceClass, this); } @@ -613,14 +480,14 @@ public class BeanStore { */ public List<ClassInfo> getMissingParamTypes(List<ParamInfo> params) { List<ClassInfo> l = AList.create(); - for (int i = 0; i < params.size(); i++) { + loop: for (int i = 0; i < params.size(); i++) { ParamInfo pi = params.get(i); ClassInfo pt = pi.getParameterType(); ClassInfo ptu = pt.unwrap(Optional.class); if (i == 0 && ptu.isInstance(outer.orElse(null))) - continue; + continue loop; if (pt.is(Optional.class)) - continue; + continue loop; String beanName = findBeanName(pi); if (beanName == null) beanName = ptu.inner().getName(); diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/FileFinder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/FileFinder.java index 82dac97..9c1ed4b 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/FileFinder.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/FileFinder.java @@ -13,8 +13,6 @@ package org.apache.juneau.cp; import static org.apache.juneau.assertions.Assertions.*; -import static org.apache.juneau.internal.ClassUtils.*; -import static org.apache.juneau.internal.ExceptionUtils.*; import java.io.*; import java.nio.file.*; @@ -109,19 +107,17 @@ public interface FileFinder { /** * Builder class. */ - public static class Builder { + public static class Builder extends BeanBuilder<FileFinder> { final Set<LocalDir> roots; long cachingLimit; List<Pattern> include, exclude; - Class<? extends FileFinder> type; - FileFinder impl; - BeanStore beanStore; /** * Constructor. */ protected Builder() { + super(BasicFileFinder.class); roots = new LinkedHashSet<>(); cachingLimit = -1; include = AList.of(Pattern.compile(".*")); @@ -134,38 +130,16 @@ public interface FileFinder { * @param copyFrom The builder being copied. */ protected Builder(Builder copyFrom) { + super(copyFrom); roots = new LinkedHashSet<>(copyFrom.roots); cachingLimit = copyFrom.cachingLimit; include = AList.of(copyFrom.include); exclude = AList.of(copyFrom.exclude); - beanStore = copyFrom.beanStore; - type = copyFrom.type; - impl = copyFrom.impl; } - /** - * Create a new {@link FileFinder} using this builder. - * - * @return A new {@link FileFinder} - */ - public FileFinder build() { - try { - if (impl != null) - return impl; - Class<? extends FileFinder> ic = isConcrete(type) ? type : getDefaultType(); - return BeanStore.of(beanStore).addBeans(Builder.class, this).createBean(ic); - } catch (ExecutableException e) { - throw runtimeException(e); - } - } - - /** - * Returns the default bean type if not specified via {@link #type(Class)}. - * - * @return The default bean type. - */ - protected Class<? extends FileFinder> getDefaultType() { - return BasicFileFinder.class; + @Override /* BeanBuilder */ + protected FileFinder buildDefault() { + return new BasicFileFinder(this); } /** @@ -250,53 +224,38 @@ public interface FileFinder { return this; } - /** - * Specifies the bean store to use for instantiating the {@link FileFinder} object. - * - * <p> - * Can be used to instantiate {@link FileFinder} implementations with injected constructor argument beans. - * - * @param value The new value for this setting. - * @return This object. - */ - @FluentSetter - public Builder beanStore(BeanStore value) { - this.beanStore = value; - return this; + // <FluentSetters> + + @Override /* BeanBuilder */ + public Builder copy() { + return new Builder(this); } - /** - * Specifies a subclass of {@link FileFinder} to create when the {@link #build()} method is called. - * - * @param value The new value for this setting. - * @return This object. - */ - @FluentSetter + @Override /* BeanBuilder */ public Builder type(Class<? extends FileFinder> value) { - this.type = value; + super.type(value); return this; } - /** - * Specifies a pre-instantiated bean for the {@link #build()} method to return. - * - * @param value The value for this setting. - * @return This object. - */ - @FluentSetter + @Override /* BeanBuilder */ public Builder impl(FileFinder value) { - this.impl = value; + super.impl(value); return this; } - /** - * Creates a copy of this builder. - * - * @return A copy of this builder. - */ - public Builder copy() { - return new Builder(this); + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); + return this; + } + + // </FluentSetters> } //----------------------------------------------------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java index 231cd13..daff73b 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java @@ -21,6 +21,7 @@ import java.text.*; import java.util.*; import java.util.concurrent.*; +import org.apache.juneau.*; import org.apache.juneau.collections.*; import org.apache.juneau.internal.*; import org.apache.juneau.marshall.*; @@ -152,11 +153,10 @@ public class Messages extends ResourceBundle { /** * Builder class. */ - public static class Builder { + public static class Builder extends BeanBuilder<Messages> { Class<?> forClass; Locale locale; - Messages impl; String name; Messages parent; List<Tuple2<Class<?>,String>> locations; @@ -169,6 +169,7 @@ public class Messages extends ResourceBundle { * @param forClass The base class. */ protected Builder(Class<?> forClass) { + super(Messages.class); this.forClass = forClass; this.name = forClass.getSimpleName(); locations = new ArrayList<>(); @@ -181,14 +182,50 @@ public class Messages extends ResourceBundle { * @param copyFrom The builder being copied. */ protected Builder(Builder copyFrom) { + super(copyFrom); forClass = copyFrom.forClass; locale = copyFrom.locale; - impl = copyFrom.impl; name = copyFrom.name; parent = copyFrom.parent; locations = new ArrayList<>(copyFrom.locations); } + @Override /* BeanBuilder */ + protected Messages buildDefault() { + + if (! locations.isEmpty()) { + Tuple2<Class<?>,String>[] mbl = locations.toArray(new Tuple2[0]); + + Builder x = null; + + for (int i = mbl.length-1; i >= 0; i--) { + Class<?> c = firstNonNull(mbl[i].getA(), forClass); + String value = mbl[i].getB(); + if (isJsonObject(value, true)) { + MessagesString ms; + try { + ms = SimpleJson.DEFAULT.read(value, MessagesString.class); + } catch (ParseException e) { + throw runtimeException(e); + } + x = Messages.create(c).name(ms.name).baseNames(split(ms.baseNames, ',')).locale(ms.locale).parent(x == null ? null : x.build()); + } else { + x = Messages.create(c).name(value).parent(x == null ? null : x.build()); + } + } + + return x == null ? null : x.build(); // Shouldn't be null. + } + + return new Messages(this); + } + + private static class MessagesString { + public String name; + public String[] baseNames; + public String locale; + } + /** * Adds a parent bundle. * @@ -258,17 +295,6 @@ public class Messages extends ResourceBundle { } /** - * Specifies a pre-instantiated bean for the {@link #build()} method to return. - * - * @param value The value for this setting. - * @return This object. - */ - public Builder impl(Messages value) { - this.impl = value; - return this; - } - - /** * Specifies a location of where to look for messages. * * @param baseClass The base class. @@ -280,49 +306,6 @@ public class Messages extends ResourceBundle { return this; } - /** - * Creates a new {@link Messages} based on the setting of this builder. - * - * @return A new {@link Messages} object. - */ - public Messages build() { - - if (impl != null) - return impl; - - if (! locations.isEmpty()) { - Tuple2<Class<?>,String>[] mbl = locations.toArray(new Tuple2[0]); - - Builder x = null; - - for (int i = mbl.length-1; i >= 0; i--) { - Class<?> c = firstNonNull(mbl[i].getA(), forClass); - String value = mbl[i].getB(); - if (isJsonObject(value, true)) { - MessagesString ms; - try { - ms = SimpleJson.DEFAULT.read(value, MessagesString.class); - } catch (ParseException e) { - throw runtimeException(e); - } - x = Messages.create(c).name(ms.name).baseNames(split(ms.baseNames, ',')).locale(ms.locale).parent(x == null ? null : x.build()); - } else { - x = Messages.create(c).name(value).parent(x == null ? null : x.build()); - } - } - - return x == null ? null : x.build(); // Shouldn't be null. - } - - return new Messages(this); - } - - private static class MessagesString { - public String name; - public String[] baseNames; - public String locale; - } - ResourceBundle getBundle() { ClassLoader cl = forClass.getClassLoader(); OMap m = OMap.of("name", name, "package", forClass.getPackage().getName()); @@ -335,14 +318,38 @@ public class Messages extends ResourceBundle { return null; } - /** - * Creates a copy of this builder. - * - * @return A copy of this builder. - */ + // <FluentSetters> + + @Override /* BeanBuilder */ public Builder copy() { return new Builder(this); } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends Messages> value) { + super.type(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder impl(Messages value) { + super.impl(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); + return this; + } + + // <FluentSetters> } //----------------------------------------------------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/encoders/EncoderGroup.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/encoders/EncoderGroup.java index 870d8e8..9f6d5f6 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/encoders/EncoderGroup.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/encoders/EncoderGroup.java @@ -103,19 +103,33 @@ public final class EncoderGroup { /** * Builder class. */ - public static class Builder { + public static class Builder extends BeanBuilder<EncoderGroup> { List<Object> entries; Builder inheritFrom; - BeanStore beanStore = BeanStore.create().build(); - Builder() { + /** + * Constructor. + */ + protected Builder() { + super(EncoderGroup.class); entries = AList.create(); } - Builder(Builder copyFrom) { + /** + * Copy constructor. + * + * @param copyFrom The builder being copied. + */ + protected Builder(Builder copyFrom) { + super(copyFrom); entries = AList.of(copyFrom.entries); } + @Override /* BeanBuilder */ + protected EncoderGroup buildDefault() { + return new EncoderGroup(this); + } + /** * Registers the specified encoders with this group. * @@ -196,32 +210,6 @@ public final class EncoderGroup { } /** - * Associates a bean store with this builder. - * - * <p> - * Used for instantiating encoders specified via classes. - * - * @param value The new value for this setting. - * @return This object (for method chaining). - */ - public Builder beanStore(BeanStore value) { - beanStore = value; - return this; - } - - /** - * Creates a new {@link EncoderGroup} object using a snapshot of the settings defined in this builder. - * - * <p> - * This method can be called multiple times to produce multiple encoder groups. - * - * @return A new {@link EncoderGroup} object. - */ - public EncoderGroup build() { - return new EncoderGroup(this); - } - - /** * Returns <jk>true</jk> if this builder is empty. * * @return <jk>true</jk> if this builder is empty. @@ -246,6 +234,39 @@ public final class EncoderGroup { return entries; } + // <FluentSetters> + + @Override /* BeanBuilder */ + public Builder copy() { + return new Builder(this); + } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends EncoderGroup> value) { + super.type(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder impl(EncoderGroup value) { + super.impl(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); + return this; + } + + // </FluentSetters> + @Override /* Object */ public String toString() { return entries.stream().map(x -> toString(x)).collect(joining(",","[","]")); @@ -258,15 +279,6 @@ public final class EncoderGroup { return "class:" + ((Class<?>)o).getSimpleName(); return "object:" + o.getClass().getSimpleName(); } - - /** - * Creates a copy of this builder. - * - * @return A copy of this builder. - */ - public Builder copy() { - return new Builder(this); - } } //----------------------------------------------------------------------------------------------------------------- @@ -286,7 +298,7 @@ public final class EncoderGroup { * @param builder The builder for this object. */ protected EncoderGroup(Builder builder) { - entries = builder.entries.stream().map(x -> instantiate(builder.beanStore, x)).toArray(Encoder[]::new); + entries = builder.entries.stream().map(x -> instantiate(builder.beanStore().orElse(BeanStore.INSTANCE), x)).toArray(Encoder[]::new); List<String> lc = AList.create(); List<Encoder> l = AList.create(); @@ -301,12 +313,11 @@ public final class EncoderGroup { this.encodingsEncoders = l.toArray(new Encoder[l.size()]); } - @SuppressWarnings("unchecked") private static Encoder instantiate(BeanStore bs, Object o) { if (o instanceof Encoder) return (Encoder)o; try { - return bs.createBean(Encoder.class, (Class<? extends Encoder>)o); + return bs.creator(Encoder.class).type((Class<?>)o).run(); } catch (ExecutableException e) { throw new RuntimeException(e); } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java index a1c9f4b..b6026d9 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java @@ -24,6 +24,7 @@ import org.apache.http.*; import org.apache.http.util.*; import org.apache.juneau.*; import org.apache.juneau.annotation.*; +import org.apache.juneau.cp.*; import org.apache.juneau.http.HttpHeaders; import org.apache.juneau.internal.*; import org.apache.juneau.svl.*; @@ -240,11 +241,10 @@ public class HeaderList { /** * Builder class. */ - public static class Builder { + public static class Builder extends BeanBuilder<HeaderList> { final List<Header> entries; List<Header> defaultEntries; - HeaderList impl; private VarResolver varResolver; boolean caseSensitive; @@ -252,6 +252,7 @@ public class HeaderList { * Constructor. */ public Builder() { + super(HeaderList.class); entries = new ArrayList<>(); } @@ -261,6 +262,7 @@ public class HeaderList { * @param copyFrom The bean to copy from. */ protected Builder(HeaderList copyFrom) { + super(copyFrom.getClass()); entries = new ArrayList<>(copyFrom.entries.length); for (int i = 0; i < copyFrom.entries.length; i++) entries.add(copyFrom.entries[i]); @@ -273,29 +275,15 @@ public class HeaderList { * @param copyFrom The bean to copy from. */ protected Builder(Builder copyFrom) { + super(copyFrom); entries = new ArrayList<>(copyFrom.entries); defaultEntries = copyFrom.defaultEntries == null ? null : new ArrayList<>(copyFrom.defaultEntries); varResolver = copyFrom.varResolver; caseSensitive = copyFrom.caseSensitive; } - /** - * Creates a modifiable copy of this builder. - * - * @return A shallow copy of this builder. - */ - public Builder copy() { - return new Builder(this); - } - - /** - * Creates a new {@link HeaderList} bean based on the contents of this builder. - * - * @return A new {@link HeaderList} bean. - */ - public HeaderList build() { - if (impl != null) - return impl; + @Override /* BeanBuilder */ + protected HeaderList buildDefault() { return entries.isEmpty() && defaultEntries == null ? EMPTY : new HeaderList(this); } @@ -1157,17 +1145,39 @@ public class HeaderList { return Optional.empty(); } - /** - * Specifies a pre-instantiated bean for the {@link #build()} method to return. - * - * @param value The value for this setting. - * @return This object. - */ + // <FluentSetters> + + @Override /* BeanBuilder */ + public Builder copy() { + return new Builder(this); + } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends HeaderList> value) { + super.type(value); + return this; + } + + @Override /* BeanBuilder */ public Builder impl(HeaderList value) { - impl = value; + super.impl(value); return this; } + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); + return this; + } + + // </FluentSetters> + @Override /* Object */ public String toString() { return "[" + join(entries, ", ") + "]"; diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartList.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartList.java index ebb80f0..b6ef8c1 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartList.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartList.java @@ -24,6 +24,7 @@ import org.apache.http.*; import org.apache.http.util.*; import org.apache.juneau.*; import org.apache.juneau.annotation.*; +import org.apache.juneau.cp.*; import org.apache.juneau.http.HttpParts; import org.apache.juneau.http.annotation.*; import org.apache.juneau.internal.*; @@ -228,7 +229,7 @@ public class PartList { /** * Builder class. */ - public static class Builder { + public static class Builder extends BeanBuilder<PartList> { final List<NameValuePair> entries; List<NameValuePair> defaultEntries; @@ -239,6 +240,7 @@ public class PartList { * Constructor. */ public Builder() { + super(PartList.class); entries = new ArrayList<>(); } @@ -248,6 +250,7 @@ public class PartList { * @param copyFrom The bean to copy from. */ public Builder(PartList copyFrom) { + super(copyFrom.getClass()); entries = new ArrayList<>(copyFrom.entries.length); for (int i = 0; i < copyFrom.entries.length; i++) entries.add(copyFrom.entries[i]); @@ -260,27 +263,15 @@ public class PartList { * @param copyFrom The bean to copy from. */ protected Builder(Builder copyFrom) { + super(copyFrom); entries = new ArrayList<>(copyFrom.entries); defaultEntries = copyFrom.defaultEntries == null ? null : new ArrayList<>(copyFrom.defaultEntries); varResolver = copyFrom.varResolver; caseInsensitive = copyFrom.caseInsensitive; } - /** - * Creates a modifiable copy of this builder. - * - * @return A shallow copy of this builder. - */ - public Builder copy() { - return new Builder(this); - } - - /** - * Creates a new {@link PartList} bean based on the contents of this builder. - * - * @return A new {@link PartList} bean. - */ - public PartList build() { + @Override /* BeanBuilder */ + protected PartList buildDefault() { return entries.isEmpty() && defaultEntries == null ? EMPTY : new PartList(this); } @@ -1136,10 +1127,42 @@ public class PartList { return Optional.empty(); } + // <FluentSetters> + @Override /* Object */ public String toString() { return "[" + join(entries, ", ") + "]"; } + @Override /* BeanBuilder */ + public Builder copy() { + return new Builder(this); + } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends PartList> value) { + super.type(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder impl(PartList value) { + super.impl(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); + return this; + } + + // </FluentSetters> } //----------------------------------------------------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java index 0534fa1..039f11c 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java @@ -67,8 +67,8 @@ public class RequestBeanMeta { RequestBeanMeta(Builder b) { this.cm = b.cm; - this.serializer = BeanStore.INSTANCE.createBean(HttpPartSerializer.class, b.serializer); - this.parser = BeanStore.INSTANCE.createBean(HttpPartParser.class, b.parser); + this.serializer = BeanCreator.create(HttpPartSerializer.class).type(b.serializer).run(); + this.parser = BeanCreator.create(HttpPartParser.class).type(b.parser).run(); Map<String,RequestBeanPropertyMeta> properties = new LinkedHashMap<>(); for (Map.Entry<String,RequestBeanPropertyMeta.Builder> e : b.properties.entrySet()) properties.put(e.getKey(), e.getValue().build(serializer, parser)); diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java index bcbb3e9..6f6b925 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java @@ -50,8 +50,8 @@ public class RequestBeanPropertyMeta { this.partType = b.partType; this.schema = b.schema; this.getter = b.getter; - this.serializer = ofNullable(schema.getSerializer() == null ? serializer : BeanStore.INSTANCE.createBean(HttpPartSerializer.class, schema.getSerializer())); - this.parser = schema.getParser() == null ? parser : BeanStore.INSTANCE.createBean(HttpPartParser.class, schema.getParser()); + this.serializer = ofNullable(schema.getSerializer() == null ? serializer : BeanCreator.create(HttpPartSerializer.class).type(schema.getSerializer()).run()); + this.parser = schema.getParser() == null ? parser : BeanCreator.create(HttpPartParser.class).type(schema.getParser()).run(); } static class Builder { diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/MethodExecStats.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/MethodExecStats.java index 2160d1c..499ad3e 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/MethodExecStats.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/MethodExecStats.java @@ -13,8 +13,6 @@ package org.apache.juneau.mstat; import static java.util.Optional.*; -import static org.apache.juneau.internal.ClassUtils.*; -import static org.apache.juneau.internal.ExceptionUtils.*; import static org.apache.juneau.internal.StringUtils.*; import java.lang.reflect.*; @@ -53,53 +51,32 @@ public class MethodExecStats { * Builder class. */ @FluentSetters - public static class Builder { + public static class Builder extends BeanBuilder<MethodExecStats> { Method method; ThrownStore thrownStore; - Class<? extends MethodExecStats> implClass; - BeanStore beanStore; - /** - * Create a new {@link MethodExecStats} using this builder. - * - * @return A new {@link ThrownStats} + * Constructor. */ - public MethodExecStats build() { - try { - Class<? extends MethodExecStats> ic = isConcrete(implClass) ? implClass : MethodExecStats.class; - return BeanStore.of(beanStore).addBeans(Builder.class, this).createBean(ic); - } catch (ExecutableException e) { - throw runtimeException(e); - } + protected Builder() { + super(MethodExecStats.class); } /** - * Specifies the bean store to use for instantiating the {@link MethodExecStats} object. + * Copy constructor. * - * <p> - * Can be used to instantiate {@link MethodExecStats} implementations with injected constructor argument beans. - * - * @param value The new value for this setting. - * @return This object (for method chaining). + * @param copyFrom The builder being copied. */ - @FluentSetter - public Builder beanStore(BeanStore value) { - beanStore = value; - return this; + protected Builder(Builder copyFrom) { + super(copyFrom); + method = copyFrom.method; + thrownStore = copyFrom.thrownStore; } - /** - * Specifies a subclass of {@link MethodExecStats} to create when the {@link #build()} method is called. - * - * @param value The new value for this setting. - * @return This object (for method chaining). - */ - @FluentSetter - public Builder implClass(Class<? extends MethodExecStats> value) { - implClass = value; - return this; + @Override /* BeanBuilder */ + protected MethodExecStats buildDefault() { + return new MethodExecStats(this); } /** @@ -125,6 +102,39 @@ public class MethodExecStats { thrownStore = value; return this; } + + // <FluentSetters> + + @Override /* BeanBuilder */ + public Builder copy() { + return new Builder(this); + } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends MethodExecStats> value) { + super.type(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder impl(MethodExecStats value) { + super.impl(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); + return this; + } + + // </FluentSetters> } //----------------------------------------------------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/MethodExecStore.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/MethodExecStore.java index cabb90b..2d3c0bb 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/MethodExecStore.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/MethodExecStore.java @@ -13,8 +13,6 @@ package org.apache.juneau.mstat; import static java.util.Optional.*; -import static org.apache.juneau.internal.ClassUtils.*; -import static org.apache.juneau.internal.ExceptionUtils.*; import java.lang.reflect.*; import java.util.*; @@ -51,18 +49,17 @@ public class MethodExecStore { /** * Builder class. */ - public static class Builder { + public static class Builder extends BeanBuilder<MethodExecStore> { ThrownStore thrownStore; - private Class<? extends MethodExecStore> implClass; - MethodExecStore impl; - BeanStore beanStore; Class<? extends MethodExecStats> statsImplClass; /** * Constructor. */ - protected Builder() {} + protected Builder() { + super(MethodExecStore.class); + } /** * Copy constructor. @@ -70,52 +67,14 @@ public class MethodExecStore { * @param copyFrom The builder to copy. */ protected Builder(Builder copyFrom) { + super(copyFrom); thrownStore = copyFrom.thrownStore; - implClass = copyFrom.implClass; - impl = copyFrom.impl; - beanStore = copyFrom.beanStore; statsImplClass = copyFrom.statsImplClass; } - /** - * Create a new {@link MethodExecStore} using this builder. - * - * @return A new {@link MethodExecStore} - */ - public MethodExecStore build() { - try { - if (impl != null) - return impl; - Class<? extends MethodExecStore> ic = isConcrete(implClass) ? implClass : MethodExecStore.class; - return BeanStore.of(beanStore).addBean(Builder.class, this).createBean(ic); - } catch (ExecutableException e) { - throw runtimeException(e); - } - } - - /** - * Specifies the bean store to use for instantiating the {@link MethodExecStore} object. - * - * <p> - * Can be used to instantiate {@link MethodExecStore} implementations with injected constructor argument beans. - * - * @param value The new value for this setting. - * @return This object. - */ - public Builder beanStore(BeanStore value) { - beanStore = value; - return this; - } - - /** - * Specifies a subclass of {@link MethodExecStore} to create when the {@link #build()} method is called. - * - * @param value The new value for this setting. - * @return This object. - */ - public Builder implClass(Class<? extends MethodExecStore> value) { - implClass = value; - return this; + @Override /* BeanBuilder */ + protected MethodExecStore buildDefault() { + return new MethodExecStore(this); } /** @@ -158,25 +117,38 @@ public class MethodExecStore { return this; } - /** - * Specifies an already-instantiated bean for the {@link #build()} method to return. - * - * @param value The new value for this setting. - * @return This object. - */ + // <FluentSetters> + + @Override /* BeanBuilder */ + public Builder copy() { + return new Builder(this); + } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends MethodExecStore> value) { + super.type(value); + return this; + } + + @Override /* BeanBuilder */ public Builder impl(MethodExecStore value) { - impl = value; + super.impl(value); return this; } - /** - * Returns a copy of this builder. - * - * @return A copy of this builder. - */ - public Builder copy() { - return new Builder(this); + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); + return this; + } + + // </FluentSetters> } //----------------------------------------------------------------------------------------------------------------- @@ -194,7 +166,7 @@ public class MethodExecStore { * @param builder The store to use for storing thrown exception statistics. */ protected MethodExecStore(Builder builder) { - this.beanStore = ofNullable(builder.beanStore).orElseGet(()->BeanStore.create().build()); + this.beanStore = builder.beanStore().orElseGet(()->BeanStore.create().build()); this.thrownStore = ofNullable(builder.thrownStore).orElse(beanStore.getBean(ThrownStore.class).orElseGet(ThrownStore::new)); this.statsImplClass = builder.statsImplClass; } @@ -214,7 +186,7 @@ public class MethodExecStore { stats = MethodExecStats .create() .beanStore(beanStore) - .implClass(statsImplClass) + .type(statsImplClass) .method(m) .thrownStore(ThrownStore.create().parent(thrownStore).build()) .build(); diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/ThrownStatsBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/ThrownStatsBuilder.java index 5f22fb3..dad37bb 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/ThrownStatsBuilder.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/ThrownStatsBuilder.java @@ -43,7 +43,7 @@ public class ThrownStatsBuilder { public ThrownStats build() { try { Class<? extends ThrownStats> ic = isConcrete(implClass) ? implClass : getDefaultImplClass(); - return BeanStore.of(beanStore).addBeans(ThrownStatsBuilder.class, this).createBean(ic); + return BeanCreator.create(ic).store(beanStore).builder(this).run(); } catch (ExecutableException e) { throw runtimeException(e); } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/ThrownStore.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/ThrownStore.java index 9567562..1039d94 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/ThrownStore.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/mstat/ThrownStore.java @@ -14,8 +14,6 @@ package org.apache.juneau.mstat; import static java.util.stream.Collectors.*; import static java.util.Collections.*; -import static org.apache.juneau.internal.ClassUtils.*; -import static org.apache.juneau.internal.ExceptionUtils.*; import static org.apache.juneau.internal.ObjectUtils.*; import static java.util.Optional.*; import static java.util.Comparator.*; @@ -58,19 +56,18 @@ public class ThrownStore { /** * Builder class. */ - public static class Builder { + public static class Builder extends BeanBuilder<ThrownStore> { ThrownStore parent; - Class<? extends ThrownStore> implClass; - ThrownStore impl; - BeanStore beanStore; Class<? extends ThrownStats> statsImplClass; Set<Class<?>> ignoreClasses; /** * Constructor. */ - protected Builder() {} + protected Builder() { + super(ThrownStore.class); + } /** * Copy constructor. @@ -78,64 +75,15 @@ public class ThrownStore { * @param copyFrom The builder to copy. */ protected Builder(Builder copyFrom) { + super(copyFrom); parent = copyFrom.parent; - implClass = copyFrom.implClass; - impl = copyFrom.impl; - beanStore = copyFrom.beanStore; statsImplClass = copyFrom.statsImplClass; ignoreClasses = copyFrom.ignoreClasses == null ? null : ASet.of(copyFrom.ignoreClasses); } - /** - * Create a new {@link ThrownStore} using this builder. - * - * @return A new {@link ThrownStore} - */ - public ThrownStore build() { - try { - if (impl != null) - return impl; - Class<? extends ThrownStore> ic = isConcrete(implClass) ? implClass : ThrownStore.class; - return BeanStore.of(beanStore).addBeans(Builder.class, this).createBean(ic); - } catch (ExecutableException e) { - throw runtimeException(e); - } - } - - /** - * Specifies the bean store to use for instantiating the {@link ThrownStore} object. - * - * <p> - * Can be used to instantiate {@link ThrownStore} implementations with injected constructor argument beans. - * - * @param value The new value for this setting. - * @return This object (for method chaining). - */ - public Builder beanStore(BeanStore value) { - this.beanStore = value; - return this; - } - - /** - * Specifies a subclass of {@link ThrownStore} to create when the {@link #build()} method is called. - * - * @param value The new value for this setting. - * @return This object (for method chaining). - */ - public Builder implClass(Class<? extends ThrownStore> value) { - this.implClass = value; - return this; - } - - /** - * Specifies a pre-instantiated bean to return when the {@link #build()} method is called. - * - * @param value The new value for this setting. - * @return This object (for method chaining). - */ - public Builder impl(ThrownStore value) { - this.impl = value; - return this; + @Override /* BeanBuilder */ + protected ThrownStore buildDefault() { + return new ThrownStore(this); } /** @@ -178,14 +126,38 @@ public class ThrownStore { return this; } - /** - * Creates a copy of this builder. - * - * @return A copy of this builder. - */ + // <FluentSetters> + + @Override /* BeanBuilder */ public Builder copy() { return new Builder(this); } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends ThrownStore> value) { + super.type(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder impl(ThrownStore value) { + super.impl(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); + return this; + } + + // </FluentSetters> } //----------------------------------------------------------------------------------------------------------------- @@ -212,7 +184,7 @@ public class ThrownStore { */ public ThrownStore(Builder builder) { this.parent = ofNullable(builder.parent); - this.beanStore = ofNullable(builder.beanStore).orElseGet(()->BeanStore.create().build()); + this.beanStore = builder.beanStore().orElseGet(()->BeanStore.create().build()); this.statsImplClass = firstNonNull(builder.statsImplClass, parent.isPresent() ? parent.get().statsImplClass : null, null); diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java index 6e7d171..7db0224 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java @@ -302,7 +302,19 @@ public abstract class ExecutableInfo { */ public final Annotation[] getParameterAnnotations(int index) { checkIndex(index); - return e.getParameterAnnotations()[index]; + Annotation[][] x = e.getParameterAnnotations(); + int c = e.getParameterCount(); + if (c != x.length) { + // Seems to be a JVM bug where getParameterAnnotations() don't take mandated parameters into account. + Annotation[][] x2 = new Annotation[c][]; + int diff = c - x.length; + for (int i = 0; i < diff; i++) + x2[i] = new Annotation[0]; + for (int i = diff; i < c; i++) + x2[i] = x[i-diff]; + x = x2; + } + return x[index]; } //----------------------------------------------------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java index 5d55945..b8951b7 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java @@ -16,6 +16,7 @@ import java.io.*; import java.util.*; import java.util.concurrent.*; +import org.apache.juneau.*; import org.apache.juneau.collections.*; import org.apache.juneau.cp.*; import org.apache.juneau.svl.vars.*; @@ -104,18 +105,17 @@ public class VarResolver { /** * Builder class. */ - public static class Builder { + public static class Builder extends BeanBuilder<VarResolver> { final VarList vars; - BeanStore beanStore; - VarResolver impl; /** * Constructor. */ protected Builder() { + super(VarResolver.class); vars = VarList.create(); - beanStore = BeanStore.create().build(); + beanStore(BeanStore.create().build()); } /** @@ -124,8 +124,9 @@ public class VarResolver { * @param copyFrom The bean to copy from. */ protected Builder(VarResolver copyFrom) { + super(copyFrom.getClass()); vars = VarList.of(copyFrom.vars); - beanStore = BeanStore.of(copyFrom.beanStore); + beanStore(copyFrom.beanStore.copy().build()); } /** @@ -134,9 +135,13 @@ public class VarResolver { * @param copyFrom The builder to copy from. */ protected Builder(Builder copyFrom) { + super(copyFrom); vars = copyFrom.vars.copy(); - beanStore = BeanStore.of(copyFrom.beanStore); - impl = copyFrom.impl; + } + + @Override /* BeanBuilder */ + protected VarResolver buildDefault() { + return new VarResolver(this); } /** @@ -180,17 +185,6 @@ public class VarResolver { } /** - * Specify a pre-instantiated bean for the {@link #build()} method to return. - * - * @param value The pre-instantiated bean. - * @return This object. - */ - public Builder impl(VarResolver value) { - this.impl = value; - return this; - } - - /** * Adds the default variables to this builder. * * <p> @@ -221,17 +215,6 @@ public class VarResolver { } /** - * Associates a bean store with this builder. - * - * @param value The bean store to associate with this var resolver. - * @return This object . - */ - public Builder beanStore(BeanStore value) { - this.beanStore = BeanStore.of(value); - return this; - } - - /** * Adds a bean to the bean store in this session. * * @param <T> The bean type. @@ -240,27 +223,42 @@ public class VarResolver { * @return This object . */ public <T> Builder bean(Class<T> c, T value) { - beanStore.addBean(c, value); + beanStore().get().addBean(c, value); return this; } - /** - * Create a new var resolver using the settings in this builder. - * - * @return A new var resolver. - */ - public VarResolver build() { - return impl != null ? impl : new VarResolver(this); - } + // <FluentSetters> - /** - * Creates a copy of this builder. - * - * @return A new copy of this builder. - */ + @Override /* BeanBuilder */ public Builder copy() { return new Builder(this); } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends VarResolver> value) { + super.type(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder impl(VarResolver value) { + super.impl(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); + return this; + } + + // </FluentSetters> } //----------------------------------------------------------------------------------------------------------------- @@ -277,20 +275,19 @@ public class VarResolver { * @param builder The builder for this object. */ protected VarResolver(Builder builder) { - this.vars = builder.vars.stream().map(x -> toVar(builder.beanStore,x)).toArray(Var[]::new); + this.vars = builder.vars.stream().map(x -> toVar(builder.beanStore().get(),x)).toArray(Var[]::new); Map<String,Var> m = new ConcurrentSkipListMap<>(); for (Var v : vars) m.put(v.getName(), v); this.varMap = AMap.unmodifiable(m); - this.beanStore = BeanStore.of(builder.beanStore); + this.beanStore = BeanStore.of(builder.beanStore().get()); } - @SuppressWarnings("unchecked") private static Var toVar(BeanStore bs, Object o) { if (o instanceof Class) - return bs.createBean(Var.class, (Class<? extends Var>)o); + return bs.creator(Var.class).type((Class<?>)o).run(); return (Var)o; } diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java index aba8ba1..288ccfc 100644 --- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java +++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java @@ -1852,7 +1852,7 @@ public class RestClient extends BeanContextable implements HttpClient, Closeable this.executorService = cp.getInstance(RESTCLIENT_executorService, ExecutorService.class).orElse(null); - this.callHandler = cp.getInstance(RESTCLIENT_callHandler, RestCallHandler.class, bs).orElseGet(bs.createBeanSupplier(BasicRestCallHandler.class)); + this.callHandler = cp.getInstance(RESTCLIENT_callHandler, RestCallHandler.class, bs).orElseGet(bs.creator(BasicRestCallHandler.class).supplier()); this.interceptors = cp.getInstanceArray(RESTCLIENT_interceptors, RestCallInterceptor.class).orElse(new RestCallInterceptor[0]); @@ -3139,7 +3139,7 @@ public class RestClient extends BeanContextable implements HttpClient, Closeable HttpPartSerializer x = partSerializers.get(c); if (x == null) { try { - x = beanStore.createBean(c); + x = beanStore.creator(c).run(); } catch (ExecutableException e) { throw new RuntimeException(e); } @@ -3158,7 +3158,7 @@ public class RestClient extends BeanContextable implements HttpClient, Closeable HttpPartParser x = partParsers.get(c); if (x == null) { try { - x = beanStore.createBean(c); + x = beanStore.creator(c).run(); } catch (ExecutableException e) { throw new RuntimeException(e); } diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationArg.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationArg.java index 0f647fa..6a3ab18 100644 --- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationArg.java +++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationArg.java @@ -40,7 +40,7 @@ public final class RemoteOperationArg { RemoteOperationArg(int index, HttpPartType partType, HttpPartSchema schema) { this.index = index; this.partType = partType; - this.serializer = ofNullable(BeanStore.INSTANCE.createBean(schema.getSerializer())); + this.serializer = ofNullable(BeanCreator.create(schema.getSerializer()).run()); this.schema = schema; } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicStaticFiles.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicStaticFiles.java index a8c1429..c3c7203 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicStaticFiles.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicStaticFiles.java @@ -36,11 +36,12 @@ import org.apache.juneau.internal.*; * Provides the same functionality as {@link BasicFileFinder} but adds support for returning files as {@link HttpResource} * objects with arbitrary headers. */ -public class BasicStaticFiles extends BasicFileFinder implements StaticFiles { +public class BasicStaticFiles implements StaticFiles { private final Header[] headers; private final MimetypesFileTypeMap mimeTypes; private final int hashCode; + private final FileFinder fileFinder; /** * Creates a new builder for this object. @@ -57,10 +58,10 @@ public class BasicStaticFiles extends BasicFileFinder implements StaticFiles { * @param builder The builder object. */ public BasicStaticFiles(StaticFiles.Builder builder) { - super(builder); this.headers = builder.headers.toArray(new Header[builder.headers.size()]); this.mimeTypes = builder.mimeTypes; this.hashCode = HashCode.of(hashCode(), headers); + this.fileFinder = builder.fileFinder.build(); } /** @@ -74,6 +75,7 @@ public class BasicStaticFiles extends BasicFileFinder implements StaticFiles { this.headers = new Header[0]; this.mimeTypes = null; this.hashCode = HashCode.of(hashCode(), headers); + this.fileFinder = null; } /** @@ -103,9 +105,13 @@ public class BasicStaticFiles extends BasicFileFinder implements StaticFiles { } } - @Override /* FileFinder */ + /** + * Returns a map representation of this bean. + * + * @return A map representation of this bean. + */ public OMap toMap() { - return super.toMap() + return OMap.create() .a("headers", headers) ; } @@ -119,4 +125,24 @@ public class BasicStaticFiles extends BasicFileFinder implements StaticFiles { public boolean equals(Object o) { return super.equals(o) && o instanceof BasicStaticFiles && eq(this, (BasicStaticFiles)o, (x,y)->eq(x.headers, y.headers)); } + + @Override /* FileFinder */ + public Optional<InputStream> getStream(String name, Locale locale) throws IOException { + return fileFinder.getStream(name, locale); + } + + @Override /* FileFinder */ + public Optional<InputStream> getStream(String name) throws IOException { + return fileFinder.getStream(name); + } + + @Override /* FileFinder */ + public Optional<String> getString(String name) throws IOException { + return fileFinder.getString(name); + } + + @Override /* FileFinder */ + public Optional<String> getString(String name, Locale locale) throws IOException { + return fileFinder.getString(name, locale); + } } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/DebugEnablement.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/DebugEnablement.java index 971440a..2087c7d 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/DebugEnablement.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/DebugEnablement.java @@ -101,8 +101,7 @@ public interface DebugEnablement { try { if (impl != null) return impl; - Class<? extends DebugEnablement> ic = isConcrete(type) ? type : getDefaultImplClass(); - return BeanStore.of(beanStore).addBeans(Builder.class, this).createBean(ic); + return BeanCreator.create(DebugEnablement.class).type(isConcrete(type) ? type : getDefaultImplClass()).store(beanStore).builder(this).run(); } catch (Exception e) { throw toHttpException(e, InternalServerError.class); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java index fa3e9b4..9b771b2 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java @@ -159,7 +159,7 @@ public class ResponseProcessorList { if (o instanceof ResponseProcessor) return (ResponseProcessor)o; try { - return (ResponseProcessor)bs.createBean((Class<?>)o); + return bs.creator(ResponseProcessor.class).type((Class<?>)o).run(); } catch (ExecutableException e) { throw new ConfigException(e, "Could not instantiate class {0}", o); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestChildren.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestChildren.java index 506c51a..9943578 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestChildren.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestChildren.java @@ -12,7 +12,7 @@ // *************************************************************************************************************************** package org.apache.juneau.rest; -import static org.apache.juneau.internal.ObjectUtils.*; +import static org.apache.juneau.internal.ClassUtils.*; import static org.apache.juneau.rest.HttpRuntimeException.*; import java.util.*; @@ -77,8 +77,7 @@ public class RestChildren { try { if (impl != null) return impl; - Class<? extends RestChildren> ic = firstNonNull(type, getDefaultImplClass()); - return BeanStore.of(beanStore).addBeans(Builder.class, this).createBean(ic); + return BeanCreator.create(RestChildren.class).type(isConcrete(type) ? type : getDefaultImplClass()).store(beanStore).builder(this).run(); } catch (Exception e) { throw toHttpException(e, InternalServerError.class); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java index 5728559..a2b0b02 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java @@ -138,7 +138,9 @@ public class RestContext extends Context { .addBean(Class.class, resourceClass) .addBean(RestContext.class, parentContext) .addBean(ServletConfig.class, servletConfig) - .createBean(v.get()); + .creator(RestContextBuilder.class) + .type(v.get()) + .run(); } //------------------------------------------------------------------------------------------------------------------- @@ -993,7 +995,7 @@ public class RestContext extends Context { beanStore.addBean(ParamInfo.class, pi); for (Class<? extends RestOpArg> c : restOpArgs) { try { - ra[i] = beanStore.createBean(c); + ra[i] = beanStore.creator(RestOpArg.class).type(c).run(); if (ra[i] != null) break; } catch (ExecutableException e) { @@ -1028,7 +1030,7 @@ public class RestContext extends Context { beanStore.addBean(ParamInfo.class, pi); for (Class<? extends RestOpArg> c : hookMethodArgs) { try { - ra[i] = beanStore.createBean(c); + ra[i] = beanStore.creator(RestOpArg.class).type(c).run(); if (ra[i] != null) break; } catch (ExecutableException e) { diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java index 2a6daab..390b11b 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java @@ -211,7 +211,7 @@ public class RestContextBuilder extends ContextBuilder implements ServletConfig @Override /* BeanContextBuilder */ public RestContext build() { try { - return (RestContext) BeanStore.of(beanStore(), resource.get()).addBeans(RestContextBuilder.class, this).createBean(getType().orElse(RestContext.class)); + return BeanCreator.create(RestContext.class).outer(resource.get()).store(beanStore()).builder(this).type(getType().orElse(RestContext.class)).run(); } catch (Exception e) { throw toHttpException(e, InternalServerError.class); } @@ -893,7 +893,7 @@ public class RestContextBuilder extends ContextBuilder implements ServletConfig // Specify the implementation class if its set as a default. defaultClasses() .get(ThrownStore.class) - .ifPresent(x -> v.get().implClass(x)); + .ifPresent(x -> v.get().type(x)); // Replace with builder from bean store. beanStore @@ -959,7 +959,7 @@ public class RestContextBuilder extends ContextBuilder implements ServletConfig // Specify the implementation class if its set as a default. defaultClasses() .get(MethodExecStore.class) - .ifPresent(x -> v.get().implClass(x)); + .ifPresent(x -> v.get().type(x)); // Replace with builder from bean store. beanStore @@ -3332,11 +3332,10 @@ public class RestContextBuilder extends ContextBuilder implements ServletConfig if (oc == resourceClass) continue; cb = RestContext.create(oc, restContext, inner); - BeanStore bf = BeanStore.of(beanStore, resource).addBean(RestContextBuilder.class, cb); - if (bf.getBean(oc).isPresent()) { - so = ()->bf.getBean(oc).get(); // If we resolved via injection, always get it this way. + if (beanStore.getBean(oc).isPresent()) { + so = ()->beanStore.getBean(oc).get(); // If we resolved via injection, always get it this way. } else { - Object o2 = bf.createBean(oc); + Object o2 = beanStore.creator(oc).builder(cb).outer(resource).run(); so = ()->o2; } } else { diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverterList.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverterList.java index 22bea1b..88ba6eb 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverterList.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverterList.java @@ -121,7 +121,7 @@ public class RestConverterList { if (o instanceof RestConverter) return (RestConverter)o; try { - return (RestConverter)bs.createBean((Class<?>)o); + return BeanCreator.create(RestConverter.class).type((Class<?>)o).store(bs).run(); } catch (ExecutableException e) { throw new ConfigException(e, "Could not instantiate class {0}", o); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestGuardList.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestGuardList.java index 536fa22..e1c4436 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestGuardList.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestGuardList.java @@ -121,7 +121,7 @@ public class RestGuardList { if (o instanceof RestGuard) return (RestGuard)o; try { - return (RestGuard)bs.createBean((Class<?>)o); + return BeanCreator.create(RestGuard.class).type((Class<?>)o).store(bs).run(); } catch (ExecutableException e) { throw new ConfigException(e, "Could not instantiate class {0}", o); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMatcherList.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMatcherList.java index a5f73af..96aac5d 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMatcherList.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMatcherList.java @@ -128,7 +128,7 @@ public class RestMatcherList { if (o instanceof RestMatcher) return (RestMatcher)o; try { - return (RestMatcher)bs.createBean((Class<?>)o); + return BeanCreator.create(RestMatcher.class).type((Class<?>)o).store(bs).run(); } catch (ExecutableException e) { throw new ConfigException(e, "Could not instantiate class {0}", o); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java index e03d954..8d4d9ce 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java @@ -253,7 +253,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(RestConverterList.Builder.class, x) - .beanCreateMethodFinder(RestConverterList.Builder.class, resource) + .createMethodFinder(RestConverterList.Builder.class, resource) .find("createConverters", Method.class) .thenFind("createConverters") .withDefault(x) @@ -310,7 +310,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(RestGuardList.Builder.class, x) - .beanCreateMethodFinder(RestGuardList.Builder.class, resource) + .createMethodFinder(RestGuardList.Builder.class, resource) .find("createGuards", Method.class) .thenFind("createGuards") .withDefault(x) @@ -358,7 +358,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(RestMatcherList.Builder.class, x) - .beanCreateMethodFinder(RestMatcherList.Builder.class, resource) + .createMethodFinder(RestMatcherList.Builder.class, resource) .find("createMatchers", Method.class) .withDefault(x) .run(); @@ -405,7 +405,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(EncoderGroup.Builder.class, x) - .beanCreateMethodFinder(EncoderGroup.Builder.class, resource) + .createMethodFinder(EncoderGroup.Builder.class, resource) .find("createEncoders", Method.class) .thenFind("createEncoders") .withDefault(x) @@ -456,7 +456,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(SerializerGroup.Builder.class, x) - .beanCreateMethodFinder(SerializerGroup.Builder.class, resource) + .createMethodFinder(SerializerGroup.Builder.class, resource) .find("createSerializers", Method.class) .thenFind("createSerializers") .withDefault(x) @@ -507,7 +507,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(ParserGroup.Builder.class, x) - .beanCreateMethodFinder(ParserGroup.Builder.class, resource) + .createMethodFinder(ParserGroup.Builder.class, resource) .find("createParsers", Method.class) .thenFind("createParsers") .withDefault(x) @@ -560,7 +560,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(HttpPartSerializer.Creator.class, x) - .beanCreateMethodFinder(HttpPartSerializer.Creator.class, resource) + .createMethodFinder(HttpPartSerializer.Creator.class, resource) .find("createPartSerializer", Method.class) .thenFind("createPartSerializer") .withDefault(x) @@ -613,7 +613,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(HttpPartParser.Creator.class, x) - .beanCreateMethodFinder(HttpPartParser.Creator.class, resource) + .createMethodFinder(HttpPartParser.Creator.class, resource) .find("createPartParser", Method.class) .thenFind("createPartParser") .withDefault(x) @@ -670,7 +670,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(UrlPathMatcherList.class, x) - .beanCreateMethodFinder(UrlPathMatcherList.class, resource) + .createMethodFinder(UrlPathMatcherList.class, resource) .find("createPathMatchers", Method.class) .withDefault(x) .run(); @@ -703,7 +703,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(JsonSchemaGenerator.class, x) - .beanCreateMethodFinder(JsonSchemaGenerator.class, resource) + .createMethodFinder(JsonSchemaGenerator.class, resource) .find("createJsonSchemaGenerator", Method.class) .thenFind("createJsonSchemaGenerator") .withDefault(x) @@ -746,7 +746,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(HeaderList.Builder.class, x) - .beanCreateMethodFinder(HeaderList.Builder.class, resource) + .createMethodFinder(HeaderList.Builder.class, resource) .find("createDefaultRequestHeaders", Method.class) .withDefault(x) .run(); @@ -772,7 +772,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(HeaderList.Builder.class, x) - .beanCreateMethodFinder(HeaderList.Builder.class, resource) + .createMethodFinder(HeaderList.Builder.class, resource) .find("createDefaultResponseHeaders", Method.class) .withDefault(x) .run(); @@ -798,7 +798,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(NamedAttributeList.class, x) - .beanCreateMethodFinder(NamedAttributeList.class, resource) + .createMethodFinder(NamedAttributeList.class, resource) .find("createDefaultRequestAttributes", Method.class) .withDefault(x) .run(); @@ -839,7 +839,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(PartList.Builder.class, x) - .beanCreateMethodFinder(PartList.Builder.class, resource) + .createMethodFinder(PartList.Builder.class, resource) .find("createDefaultRequestQuery", Method.class) .thenFind("createDefaultRequestQuery") .withDefault(x) @@ -881,7 +881,7 @@ public class RestOpContext extends BeanContext implements Comparable<RestOpConte x = BeanStore .of(beanStore, resource) .addBean(PartList.Builder.class, x) - .beanCreateMethodFinder(PartList.Builder.class, resource) + .createMethodFinder(PartList.Builder.class, resource) .find("createDefaultRequestFormData", Method.class) .thenFind("createDefaultRequestFormData") .withDefault(x) diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java index 4a1021b..f230dda 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java @@ -76,12 +76,10 @@ public class RestOpContextBuilder extends BeanContextBuilder { throw new NoSuchMethodError("Not implemented."); } - @SuppressWarnings("unchecked") @Override /* BeanContextBuilder */ public RestOpContext build() { try { - Class<? extends RestOpContext> ic = (Class<? extends RestOpContext>) getType().orElse(getDefaultImplClass()); - return BeanStore.of(beanStore).addBean(RestOpContextBuilder.class, this).createBean(ic); + return BeanCreator.create(RestOpContext.class).type(getType().orElse(getDefaultImplClass())).store(beanStore).builder(this).run(); } catch (Exception e) { throw toHttpException(e, InternalServerError.class); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperations.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperations.java index 340a92c..226182c 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperations.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperations.java @@ -76,8 +76,7 @@ public class RestOperations { try { if (impl != null) return impl; - Class<? extends RestOperations> ic = firstNonNull(type, getDefaultImplClass()); - return BeanStore.of(beanStore).addBeans(Builder.class, this).createBean(ic); + return BeanCreator.create(RestOperations.class).type(firstNonNull(type, getDefaultImplClass())).store(beanStore).builder(this).run(); } catch (Exception e) { throw toHttpException(e, InternalServerError.class); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFiles.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFiles.java index 11cff5c..e35590f 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFiles.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFiles.java @@ -18,6 +18,7 @@ import java.util.*; import javax.activation.*; import org.apache.http.*; +import org.apache.juneau.*; import org.apache.juneau.collections.*; import org.apache.juneau.cp.*; import org.apache.juneau.http.resource.*; @@ -53,16 +54,19 @@ public interface StaticFiles extends FileFinder { * Builder class. */ @FluentSetters - public static class Builder extends FileFinder.Builder { + public static class Builder extends BeanBuilder<StaticFiles> { List<Header> headers; MimetypesFileTypeMap mimeTypes; + FileFinder.Builder fileFinder; /** * Constructor. */ protected Builder() { + super(BasicStaticFiles.class); headers = AList.create(); + fileFinder = FileFinder.create(); mimeTypes = new ExtendedMimetypesFileTypeMap(); } @@ -77,14 +81,9 @@ public interface StaticFiles extends FileFinder { mimeTypes = copyFrom.mimeTypes; } - @Override - public StaticFiles build() { - return (StaticFiles)super.build(); - } - - @Override - protected Class<? extends FileFinder> getDefaultType() { - return BasicStaticFiles.class; + @Override /* BeanBuilder */ + protected StaticFiles buildDefault() { + return new BasicStaticFiles(this); } /** @@ -126,58 +125,112 @@ public interface StaticFiles extends FileFinder { return this; } - @Override - public Builder copy() { - return new Builder(this); + /** + * Enables in-memory caching of files for quicker retrieval. + * + * @param cachingLimit The maximum file size in bytes. + * @return This object. + */ + @FluentSetter + public Builder caching(long cachingLimit) { + fileFinder.caching(cachingLimit); + return this; } - // <FluentSetters> - - @Override /* GENERATED - FileFinderBuilder */ - public Builder beanStore(BeanStore value) { - super.beanStore(value); + /** + * Adds a class subpackage to the lookup paths. + * + * @param c The class whose package will be added to the lookup paths. Must not be <jk>null</jk>. + * @param path The absolute or relative subpath. + * @param recursive If <jk>true</jk>, also recursively adds all the paths of the parent classes as well. + * @return This object. + */ + @FluentSetter + public Builder cp(Class<?> c, String path, boolean recursive) { + fileFinder.cp(c, path, recursive); return this; } - @Override /* GENERATED - FileFinderBuilder */ - public Builder caching(long cachingLimit) { - super.caching(cachingLimit); + /** + * Adds a file system directory to the lookup paths. + * + * @param path The path relative to the working directory. Must not be <jk>null</jk> + * @return This object. + */ + @FluentSetter + public Builder dir(String path) { + fileFinder.dir(path); return this; } - @Override /* GENERATED - FileFinderBuilder */ - public Builder cp(Class<?> c, String path, boolean recursive) { - super.cp(c, path, recursive); + /** + * Specifies the regular expression file name pattern to use to exclude files from being retrieved from the file source. + * + * @param patterns + * The regular expression exclude patterns. + * <br>If none are specified, no files will be excluded. + * @return This object. + */ + @FluentSetter + public Builder exclude(String...patterns) { + fileFinder.exclude(patterns); return this; } - @Override /* GENERATED - FileFinderBuilder */ - public Builder dir(String path) { - super.dir(path); + /** + * Specifies the regular expression file name patterns to use to include files being retrieved from the file source. + * + * @param patterns + * The regular expression include patterns. + * <br>The default is <js>".*"</js>. + * @return This object. + */ + @FluentSetter + public Builder include(String...patterns) { + fileFinder.include(patterns); return this; } - @Override /* GENERATED - FileFinderBuilder */ - public Builder exclude(String...patterns) { - super.exclude(patterns); + /** + * Adds a file system directory to the lookup paths. + * + * @param path The directory path. + * @return This object. + */ + @FluentSetter + public Builder path(Path path) { + fileFinder.path(path); return this; } - @Override /* GENERATED - FileFinderBuilder */ - public Builder type(Class<? extends org.apache.juneau.cp.FileFinder> value) { + // <FluentSetters> + + @Override /* BeanBuilder */ + public Builder copy() { + return new Builder(this); + } + + @Override /* BeanBuilder */ + public Builder type(Class<? extends StaticFiles> value) { super.type(value); return this; } - @Override /* GENERATED - FileFinderBuilder */ - public Builder include(String...patterns) { - super.include(patterns); + @Override /* BeanBuilder */ + public Builder impl(StaticFiles value) { + super.impl(value); return this; } - @Override /* GENERATED - FileFinderBuilder */ - public Builder path(Path path) { - super.path(path); + @Override /* BeanBuilder */ + public Builder outer(Object value) { + super.outer(value); + return this; + } + + @Override /* BeanBuilder */ + public Builder beanStore(BeanStore value) { + super.beanStore(value); return this; } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerProvider.java index a29b087..e064ba6 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerProvider.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerProvider.java @@ -103,8 +103,7 @@ public interface SwaggerProvider { try { if (impl != null) return impl; - Class<? extends SwaggerProvider> ic = isConcrete(type) ? type : getDefaultType(); - return BeanStore.of(beanStore).addBeans(Builder.class, this).createBean(ic); + return BeanCreator.create(SwaggerProvider.class).type(isConcrete(type) ? type : getDefaultType()).store(beanStore).builder(this).run(); } catch (Exception e) { throw toHttpException(e, InternalServerError.class); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/RestLogger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/RestLogger.java index 5d4feb5..4304b85 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/RestLogger.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/RestLogger.java @@ -200,8 +200,7 @@ public interface RestLogger { try { if (impl != null) return impl; - Class<? extends RestLogger> ic = isConcrete(type) ? type : BasicRestLogger.class; - return BeanStore.of(beanStore).addBeans(Builder.class, this).createBean(ic); + return BeanCreator.create(RestLogger.class).type(isConcrete(type) ? type : BasicRestLogger.class).store(beanStore).builder(this).findSingleton().run(); } catch (Exception e) { throw toHttpException(e, InternalServerError.class); } diff --git a/juneau-utest/src/test/java/org/apache/juneau/cp/BeanCreator_Test.java b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanCreator_Test.java new file mode 100644 index 0000000..bdd0021 --- /dev/null +++ b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanCreator_Test.java @@ -0,0 +1,419 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.cp; + +import static org.apache.juneau.assertions.Assertions.*; +import static org.junit.runners.MethodSorters.*; + +import java.util.*; + +import javax.inject.*; + +import static org.apache.juneau.cp.BeanCreator.*; + +import org.apache.juneau.annotation.*; +import org.junit.*; + +@FixMethodOrder(NAME_ASCENDING) +public class BeanCreator_Test { + + //----------------------------------------------------------------------------------------------------------------- + // Basic tests. + //----------------------------------------------------------------------------------------------------------------- + + public static class A1 {} + + @Test + public void a01_basic() { + assertObject(create(A1.class).run()).isNotNull(); + assertObject(create(null).run()).isNull(); + } + + public class A2 {} + + @Test + public void a02_outer() { + BeanCreator_Test outer = new BeanCreator_Test(); + assertObject(create(A2.class).outer(outer).run()).isNotNull(); + } + + //----------------------------------------------------------------------------------------------------------------- + // Static creators. + //----------------------------------------------------------------------------------------------------------------- + + public static class B1 { + public String a; + public static B1 create() { + B1 x = new B1(); + x.a = "foo"; + return x; + } + } + + @Test + public void b01_staticCreator_create() { + assertString(create(B1.class).run().a).is("foo"); + + } + + public static abstract class B2 { + public String a; + public static B2 getInstance() { + B2 x = new B2(){}; + x.a = "foo"; + return x; + } + } + + @Test + public void b02_staticCreator_getInstance() { + assertString(create(B2.class).run().a).is("foo"); + } + + public static class B3a { + public String a; + public static B3a getFoo() { + B3a x = new B3a(); + x.a = "foo"; + return x; + } + protected static B3a create() { + B3a x = new B3a(); + x.a = "foo"; + return x; + } + public static B3a create(String foo) { + B3a x = new B3a(); + x.a = "foo"; + return x; + } + @Deprecated protected static B3a getInstance() { + B3a x = new B3a(); + x.a = "foo"; + return x; + } + protected B3a() { + a = "bar"; + } + } + + public static class B3b { + public String a; + public B3b create() { + B3b x = new B3b(); + x.a = "foo"; + return x; + } + @BeanIgnore public static B3b getInstance() { + B3b x = new B3b(); + x.a = "foo"; + return x; + } + protected B3b() { + a = "bar"; + } + } + + public static class B3c { + public String a; + public static String create() { + return null; + } + protected B3c() { + a = "bar"; + } + } + + @Test + public void b03_staticCreator_invalidSignatures() { + BeanStore bs = BeanStore.INSTANCE; + assertString(bs.creator(B3a.class).run().a).is("bar"); + assertString(bs.creator(B3b.class).run().a).is("bar"); + assertString(bs.creator(B3c.class).run().a).is("bar"); + } + + public static class B4 { + public String a; + public static B4 create() { + B4 x = new B4(); + x.a = "foo"; + return x; + } + public static B4 create(Integer i, String s) { + B4 x = new B4(); + x.a = i.toString() + s; + return x; + } + public static B4 create(Integer i) { + B4 x = new B4(); + x.a = i.toString(); + return x; + } + protected B4() { + a = "bar"; + } + } + + @Test + public void b04_staticCreator_withBeans() { + BeanStore bs = BeanStore.create().build(); + assertString(bs.creator(B4.class).run().a).is("foo"); + bs.add(Integer.class, 1); + assertString(bs.creator(B4.class).run().a).is("1"); + bs.add(String.class, "x"); + assertString(bs.creator(B4.class).run().a).is("1x"); + bs.add(Integer.class, null); + assertString(bs.creator(B4.class).run().a).is("foo"); + } + + public static class B5 { + public String a; + public static B5 create() { + return new B5("foo"); + } + protected B5(String s) { + a = s; + } + } + + @Test + public void b05_staticCreator_ignoredWithBuilder() { + assertString(create(B5.class).builder("bar").run().a).is("bar"); + } + + public static class B6 { + public String a = "foo"; + public static B6 create(Optional<String> s) { + B6 x = new B6(); + x.a = s.orElse(null); + return x; + } + } + + @Test + public void b06_staticCreator_withOptional() { + BeanStore bs = BeanStore.create().build(); + assertString(bs.creator(B6.class).run().a).isNull(); + bs.add(String.class, "bar"); + assertString(bs.creator(B6.class).run().a).is("bar"); + } + + public static class B7 { + public String a = "foo"; + public static B7 create(Optional<String> s, Integer i) { + B7 x = new B7(); + x.a = s.orElse(null) + "," + i; + return x; + } + private B7() {} + } + + @Test + public void b07_staticCreator_missingPrereqs() { + BeanStore bs = BeanStore.create().build(); + assertThrown(()->bs.creator(B7.class).run()).message().is("Could not instantiate class org.apache.juneau.cp.BeanCreator_Test$B7: Static creator found but could not find prerequisites: Integer."); + bs.add(Integer.class, 1); + assertString(bs.creator(B7.class).run().a).is("null,1"); + bs.add(String.class, "bar"); + assertString(bs.creator(B7.class).run().a).is("bar,1"); + } + //----------------------------------------------------------------------------------------------------------------- + // Invalid types. + //----------------------------------------------------------------------------------------------------------------- + + public static abstract class C1 { + public C1() {} + } + + public interface C2 {} + + @Test + public void c01_staticCreator_withBeans() { + assertThrown(()->create(C1.class).run()).message().is("Could not instantiate class "+C1.class.getName()+": Class is abstract."); + assertThrown(()->create(C2.class).run()).message().is("Could not instantiate class "+C2.class.getName()+": Class is an interface."); + } + + //----------------------------------------------------------------------------------------------------------------- + // Constructors. + //----------------------------------------------------------------------------------------------------------------- + + public static class D1 { + public String a; + public D1(String s) { + a = "s="+s; + } + public D1(Integer i) { + a = "i="+i; + } + public D1(String s, Integer i) { + a = "s="+s+",i="+i; + } + } + + @Test + public void d01_constructors_public() { + BeanStore bs = BeanStore.create().build(); + assertThrown(()->bs.creator(D1.class).run()).message().is("Could not instantiate class "+D1.class.getName()+": Public constructor found but could not find prerequisites: Integer or Integer,String or String."); + bs.add(String.class, "foo"); + assertString(bs.creator(D1.class).run().a).is("s=foo"); + bs.add(Integer.class, 1); + assertString(bs.creator(D1.class).run().a).is("s=foo,i=1"); + bs.removeBean(String.class); + assertString(bs.creator(D1.class).run().a).is("i=1"); + } + + public static class D2 { + public String a; + protected D2(String s) { + a = "s="+s; + } + protected D2(Integer i) { + a = "i="+i; + } + protected D2(String s, Integer i) { + a = "s="+s+",i="+i; + } + } + + @Test + public void d02_constructors_protected() { + BeanStore bs = BeanStore.create().build(); + assertThrown(()->bs.creator(D2.class).run()).message().is("Could not instantiate class "+D2.class.getName()+": Protected constructor found but could not find prerequisites: Integer or Integer,String or String."); + bs.add(String.class, "foo"); + assertString(bs.creator(D2.class).run().a).is("s=foo"); + bs.add(Integer.class, 1); + assertString(bs.creator(D2.class).run().a).is("s=foo,i=1"); + bs.removeBean(String.class); + assertString(bs.creator(D2.class).run().a).is("i=1"); + } + + public static class D3 { + public String a; + public D3(String s) { + a = "s="+s; + } + protected D3(String s, Integer i) { + a = "s="+s+",i="+i; + } + } + + @Test + public void d03_constructors_publicOverProtected() { + BeanStore bs = BeanStore.create().build(); + assertThrown(()->bs.creator(D3.class).run()).message().is("Could not instantiate class "+D3.class.getName()+": Public constructor found but could not find prerequisites: String."); + bs.add(String.class, "foo"); + bs.add(Integer.class, 1); + assertString(bs.creator(D3.class).run().a).is("s=foo"); + } + + public static class D4 { + private D4() {} + } + + @Test + public void d04_constructors_private() { + assertThrown(()->create(D4.class).run()).message().is("Could not instantiate class "+D4.class.getName()+": No public/protected constructors found."); + } + + public static class D5 { + public String a; + public D5(@Named("foo") Object o) { + a = o.toString(); + } + public D5(@Named("foo") Object o, Integer i) { + a = o.toString() + "," + i; + } + } + + @Test + public void d05_constructors_namedBean() { + BeanStore bs = BeanStore.create().build(); + assertThrown(()->bs.creator(D5.class).run()).message().is("Could not instantiate class "+D5.class.getName()+": Public constructor found but could not find prerequisites: Integer,foo or foo."); + bs.add("foo", "bar"); + assertString(bs.creator(D5.class).run().a).is("bar"); + } + + public class D6 { + public String a; + public D6(@Named("foo") Object o) { + a = o.toString(); + } + public D6(@Named("foo") Object o, Integer i) { + a = o.toString() + "," + i; + } + } + + @Test + public void d06_constructors_namedBean_withOuter() { + BeanStore bs = BeanStore.create().build(); + Object outer = new BeanCreator_Test(); + assertThrown(()->bs.creator(D6.class).outer(outer).run()).message().is("Could not instantiate class "+D6.class.getName()+": Public constructor found but could not find prerequisites: Integer,foo or foo."); + bs.add("foo", "bar"); + assertString(bs.creator(D6.class).outer(outer).run().a).is("bar"); + } + + //----------------------------------------------------------------------------------------------------------------- + // Builders. + //----------------------------------------------------------------------------------------------------------------- + + public static class E1 { + public String a; + + public static Builder create() { + return new Builder(); + } + + public static class Builder { + public String b; + } + + protected E1(Builder b) { + a = b.b; + } + } + + @Test + public void e01_builders() { + BeanStore bs = BeanStore.create().build(); + E1.Builder b = E1.create(); + b.b = "foo"; + assertString(bs.creator(E1.class).builder(b).run().a).is("foo"); + } + + public static class E2 { + public String a; + public static Builder create() { + return new Builder(); + } + public static class Builder { + public String b; + } + protected E2(Builder b, Integer i) { + a = b.b; + } + protected E2(Integer i) { + } + E2(String s) { + } + protected E2(Builder b) { + a = b.b; + } + } + + @Test + public void e02_builders_inherent() { + BeanStore bs = BeanStore.create().build(); + assertString(bs.creator(E2.class).run().a).isNull(); + assertThrown(()->bs.creator(E2.class).builder(true).run()).message().is("Could not instantiate class "+E2.class.getName()+": Protected constructor found but could not find prerequisites: Builder or Builder,Integer or Integer."); + } +} diff --git a/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java index 603cd5f..39f2650 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java @@ -47,274 +47,6 @@ public class BeanStore_Test { } //----------------------------------------------------------------------------------------------------------------- - // Create bean - No args - //----------------------------------------------------------------------------------------------------------------- - - public static class B1 { - public static B1 create() { - return new B1(); - } - private B1() {} - } - - @Test - public void b01_createBean_create() throws Exception { - BeanStore bs = new BeanStore(); - assertObject(bs.createBean(B1.class)).isType(B1.class); - } - - public static class B2 { - public static B2 getInstance() { - return new B2(); - } - private B2() {} - } - - @Test - public void b02_createBean_getInstance() throws Exception { - BeanStore bs = new BeanStore(); - assertObject(bs.createBean(B2.class)).isType(B2.class); - } - - public static class B3a { - protected static B3a create() { - return new B3a(); - } - private B3a() {} - } - - @Test - public void b03a_createBean_create_notVisible() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(B3a.class)).message().is("Could not instantiate class "+CNAME+"$B3a: Public constructor or creator not found."); - } - - public static class B3b { - public static B3b create2() { - return new B3b(); - } - private B3b() {} - } - - @Test - public void b03b_createBean_create_wrongName() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(B3b.class)).message().is("Could not instantiate class "+CNAME+"$B3b: Public constructor or creator not found."); - } - - public static class B3c { - public static B3b create() { - return new B3b(); - } - private B3c() {} - } - - @Test - public void b03c_createBean_create_wrongReturnType() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(B3c.class)).message().is("Could not instantiate class "+CNAME+"$B3c: Public constructor or creator not found."); - } - - public static class B3d { - @Deprecated - public static B3d create() { - return new B3d(); - } - private B3d() {} - } - - @Test - public void b03d_createBean_create_deprecated() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(B3d.class)).message().is("Could not instantiate class "+CNAME+"$B3d: Public constructor or creator not found."); - } - - public static class B3e { - @BeanIgnore - public static B3e create() { - return new B3e(); - } - private B3e() {} - } - - @Test - public void b03e_createBean_create_beanIgnore() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(B3e.class)).message().is("Could not instantiate class "+CNAME+"$B3e: Public constructor or creator not found."); - } - - public abstract static class B4a { - public static B4a create() { - return new B4a() {}; - } - private B4a() {} - } - - @Test - public void b04a_createBean_create_abstract() throws Exception { - BeanStore bs = new BeanStore(); - assertObject(bs.createBean(B4a.class)).exists(); - } - - public static interface B4b { - public static B4b create() { - return new B4b() {}; - } - } - - @Test - public void b04b_createBean_create_interface() throws Exception { - BeanStore bs = new BeanStore(); - assertObject(bs.createBean(B4b.class)).exists(); - } - - //----------------------------------------------------------------------------------------------------------------- - // Create bean - With args - //----------------------------------------------------------------------------------------------------------------- - - public static class C1a { - public A a; - public static C1a create(A a) { - C1a x = new C1a(); - x.a = a; - return x; - } - private C1a() {} - } - - @Test - public void c01_createBean_create_withArgs() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(C1a.class)).message().is("Could not instantiate class "+CNAME+"$C1a: Static creator found but could not find prerequisites: A."); - bs.addBean(A.class, new A()); - assertObject(bs.createBean(C1a.class)).exists(); - assertObject(bs.createBean(C1a.class)).exists(); - } - - public interface C2a { - public static C2a create(A a) { - return new C2a(){}; - } - } - - @Test - public void c02a_createBean_create_withArgs_interface() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(C2a.class)).message().is("Could not instantiate class "+CNAME+"$C2a: Static creator found but could not find prerequisites: A."); - bs.addBean(A.class, new A()); - assertObject(bs.createBean(C2a.class)).exists(); - assertObject(bs.createBean(C2a.class)).exists(); - } - - public static abstract class C2b { - public static C2b create(A a) { - return new C2b(){}; - } - } - - @Test - public void c02b_createBean_create_withArgs_abstractClass() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(C2b.class)).message().is("Could not instantiate class "+CNAME+"$C2b: Static creator found but could not find prerequisites: A."); - bs.addBean(A.class, new A()); - assertObject(bs.createBean(C2b.class)).exists(); - assertObject(bs.createBean(C2b.class)).exists(); - } - - public static interface C2c {} - - @Test - public void c02c_createBean_create_withArgs_interface() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(C2c.class)).message().is("Could not instantiate class "+CNAME+"$C2c: Class is an interface."); - bs.addBean(A.class, new A()); - assertThrown(()->bs.createBean(C2c.class)).message().is("Could not instantiate class "+CNAME+"$C2c: Class is an interface."); - } - - public static abstract class C2d {} - - @Test - public void c02d_createBean_create_withArgs_abstractClass() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(C2d.class)).message().is("Could not instantiate class "+CNAME+"$C2d: Class is abstract."); - bs.addBean(A.class, new A()); - assertThrown(()->bs.createBean(C2d.class)).message().is("Could not instantiate class "+CNAME+"$C2d: Class is abstract."); - } - - public static class C3a { - public A a; - public static C3a create(@Named("Foo") A a) { - C3a x = new C3a(); - x.a = a; - return x; - } - private C3a() {} - } - - @Test - public void c03_createBean_create_withNamedArgs() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(C3a.class)).message().is("Could not instantiate class "+CNAME+"$C3a: Static creator found but could not find prerequisites: A."); - bs.addBean("Foo", new A()); - assertObject(bs.createBean(C3a.class)).exists(); - assertObject(bs.createBean(C3a.class)).exists(); - } - - //----------------------------------------------------------------------------------------------------------------- - // Construct bean - With args - //----------------------------------------------------------------------------------------------------------------- - - public static class D1a { - public A a; - public D1a(A a) { - this.a = a; - } - } - - @Test - public void d01a_createBean_construct_withArgs() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(D1a.class)).message().is("Could not instantiate class "+CNAME+"$D1a: Public constructor found but could not find prerequisites: A."); - bs.addBean(A.class, new A()); - assertObject(bs.createBean(D1a.class)).exists(); - assertObject(bs.createBean(D1a.class)).exists(); - } - - public class D1b { - public A a; - public D1b(A a) { - this.a = a; - } - } - - @Test - public void d01b_createBean_construct_withArgs_inner() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(D1b.class)).message().is("Could not instantiate class "+CNAME+"$D1b: Public constructor found but could not find prerequisites: BeanStore_Test,A."); - BeanStore bs2 = BeanStore.of(null,this); - assertThrown(()->bs2.createBean(D1b.class)).message().is("Could not instantiate class "+CNAME+"$D1b: Public constructor found but could not find prerequisites: A."); - bs2.addBean(A.class, new A()); - assertObject(bs2.createBean(D1b.class)).exists(); - assertObject(bs2.createBean(D1b.class)).exists(); - } - - public static class D2a { - public A a; - public D2a(@Named("Foo") A a) { - this.a = a; - } - } - - @Test - public void d02a_createBean_construct_withNamedArgs() throws Exception { - BeanStore bs = new BeanStore(); - assertThrown(()->bs.createBean(D2a.class)).message().is("Could not instantiate class "+CNAME+"$D2a: Public constructor found but could not find prerequisites: A."); - bs.addBean("Foo", new A()); - assertObject(bs.createBean(D2a.class)).exists(); - assertObject(bs.createBean(D2a.class)).exists(); - } - - //----------------------------------------------------------------------------------------------------------------- // Create bean via method. //----------------------------------------------------------------------------------------------------------------- @@ -402,70 +134,67 @@ public class BeanStore_Test { BeanStore bs = BeanStore.create().build(); E1 x = new E1(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA0").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA1").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA2").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA3").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA4").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA5").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA6").run()).isNull(); - assertThrown(()->bs.beanCreateMethodFinder(E.class, x).find("createA7").run()).message().is("foo"); - - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createB0").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createB1").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createB2").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createB3").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createB4").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createB5").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createB6").run()).isNull(); - assertThrown(()->bs.beanCreateMethodFinder(E.class, x).find("createB7").run()).message().is("foo"); - - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC1").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC2").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run().a).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createA0").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createA1").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createA2").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createA3").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createA4").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createA5").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createA6").run()).isNull(); + assertThrown(()->bs.createMethodFinder(E.class, x).find("createA7").run()).message().is("foo"); + + assertObject(bs.createMethodFinder(E.class, x).find("createB0").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createB1").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createB2").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createB3").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createB4").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createB5").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createB6").run()).isNull(); + assertThrown(()->bs.createMethodFinder(E.class, x).find("createB7").run()).message().is("foo"); + + assertObject(bs.createMethodFinder(E.class, x).find("createC1").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC2").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run().a).isNull(); bs.addBean(A.class, new A()); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC1").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC2").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run().a).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC1").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC2").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run().a).exists(); bs.addSupplier(A.class, ()->(A)null); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC1").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC2").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run().a).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC1").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC2").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run().a).isNull(); bs.addSupplier(A.class, ()->new A()); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC1").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC2").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run().a).exists(); - - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC4").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC5").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC5").run().a).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC1").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC2").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run().a).exists(); + + assertObject(bs.createMethodFinder(E.class, x).find("createC4").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC5").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC5").run().a).isNull(); bs.addSupplier("Foo", ()->new A()); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC4").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC5").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC5").run().a).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC4").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC5").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC5").run().a).exists(); bs.addSupplier("Foo", null); bs.addSupplier(A.class, ()->null); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC1").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC2").run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createC3").run().a).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC1").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC2").run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createC3").run().a).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createAx").thenFind("createA1").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA1").thenFind("createAx").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA1", A.class).thenFind("createA2", A.class).run()).isNull(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA1", A.class).thenFind("createA1").run()).exists(); - assertObject(bs.beanCreateMethodFinder(E.class, x).find("createA1", A.class).withDefault(new E()).run()).exists(); - - bs.addSupplier(A.class, ()->new A()); - assertObject(bs.createBean(A.class)).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createAx").thenFind("createA1").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createA1").thenFind("createAx").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createA1", A.class).thenFind("createA2", A.class).run()).isNull(); + assertObject(bs.createMethodFinder(E.class, x).find("createA1", A.class).thenFind("createA1").run()).exists(); + assertObject(bs.createMethodFinder(E.class, x).find("createA1", A.class).withDefault(new E()).run()).exists(); BeanStore bs2 = BeanStore.of(bs, null); - assertObject(bs2.beanCreateMethodFinder(E.class, x).find("createA1").run()).exists(); + assertObject(bs2.createMethodFinder(E.class, x).find("createA1").run()).exists(); assertString(bs2.toString()).is("{parent:{beanMap:['"+CNAME+"$A']}}"); } diff --git a/juneau-utest/src/test/java/org/apache/juneau/mstat/MethodExecStore_Test.java b/juneau-utest/src/test/java/org/apache/juneau/mstat/MethodExecStore_Test.java index 3752f7e..64e5b06 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/mstat/MethodExecStore_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/mstat/MethodExecStore_Test.java @@ -42,7 +42,7 @@ public class MethodExecStore_Test { @Test public void a02_builder_implClass() { - assertObject(MethodExecStore.create().implClass(A1.class).build()).isType(A1.class); + assertObject(MethodExecStore.create().type(A1.class).build()).isType(A1.class); } public static class A4 extends MethodExecStore { @@ -54,7 +54,7 @@ public class MethodExecStore_Test { @Test public void a04_builder_implClass_bad() { - assertThrown(()->MethodExecStore.create().implClass(A4.class).build()).messages().contains("foobar"); + assertThrown(()->MethodExecStore.create().type(A4.class).build()).messages().contains("foobar"); } public static class A5a {} @@ -79,12 +79,12 @@ public class MethodExecStore_Test { public void a05_builder_beanFactory() throws Exception { BeanStore bs = BeanStore.create().build(); - assertThrown(()->MethodExecStore.create().beanStore(bs).implClass(A5b.class).build()).messages().any(contains("Public constructor found but could not find prerequisites: A5a")); - assertObject(MethodExecStore.create().beanStore(bs).implClass(A5c.class).build()).isType(A5c.class); + assertThrown(()->MethodExecStore.create().beanStore(bs).type(A5b.class).build()).messages().any(contains("Public constructor found but could not find prerequisites: A5a")); + assertObject(MethodExecStore.create().beanStore(bs).type(A5c.class).build()).isType(A5c.class); bs.addBean(A5a.class, new A5a()); - assertObject(MethodExecStore.create().beanStore(bs).implClass(A5b.class).build()).isType(A5b.class); - assertObject(MethodExecStore.create().beanStore(bs).implClass(A5c.class).build()).isType(A5c.class); + assertObject(MethodExecStore.create().beanStore(bs).type(A5b.class).build()).isType(A5b.class); + assertObject(MethodExecStore.create().beanStore(bs).type(A5c.class).build()).isType(A5c.class); } diff --git a/juneau-utest/src/test/java/org/apache/juneau/mstat/ThrownStore_Test.java b/juneau-utest/src/test/java/org/apache/juneau/mstat/ThrownStore_Test.java index 55fa449..2f694ba 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/mstat/ThrownStore_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/mstat/ThrownStore_Test.java @@ -195,7 +195,7 @@ public class ThrownStore_Test { @Test public void b02_builder_implClass() { - assertObject(ThrownStore.create().implClass(B1.class).build()).isType(B1.class); + assertObject(ThrownStore.create().type(B1.class).build()).isType(B1.class); } public static class B4 extends ThrownStore { @@ -206,7 +206,7 @@ public class ThrownStore_Test { @Test public void b04_builder_implClass_bad() { - assertThrown(()->ThrownStore.create().implClass(B4.class).build()).messages().contains("foobar"); + assertThrown(()->ThrownStore.create().type(B4.class).build()).messages().contains("foobar"); } public static class B5a {} @@ -229,12 +229,12 @@ public class ThrownStore_Test { public void b05_builder_beanFactory() throws Exception { BeanStore bs = BeanStore.create().build(); - assertThrown(()->ThrownStore.create().beanStore(bs).implClass(B5b.class).build()).messages().any(contains("Public constructor found but could not find prerequisites: B5a")); - assertObject(ThrownStore.create().beanStore(bs).implClass(B5c.class).build()).isType(B5c.class); + assertThrown(()->ThrownStore.create().beanStore(bs).type(B5b.class).build()).messages().any(contains("Public constructor found but could not find prerequisites: B5a")); + assertObject(ThrownStore.create().beanStore(bs).type(B5c.class).build()).isType(B5c.class); bs.addBean(B5a.class, new B5a()); - assertObject(ThrownStore.create().beanStore(bs).implClass(B5b.class).build()).isType(B5b.class); - assertObject(ThrownStore.create().beanStore(bs).implClass(B5c.class).build()).isType(B5c.class); + assertObject(ThrownStore.create().beanStore(bs).type(B5b.class).build()).isType(B5b.class); + assertObject(ThrownStore.create().beanStore(bs).type(B5c.class).build()).isType(B5c.class); } public static class B6a {}