MultiWrapDynaClass.java
- /*
- * 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.commons.configuration2.builder.combined;
- import java.util.Collection;
- import java.util.HashMap;
- import java.util.LinkedList;
- import java.util.Map;
- import java.util.stream.Stream;
- import org.apache.commons.beanutils.DynaBean;
- import org.apache.commons.beanutils.DynaClass;
- import org.apache.commons.beanutils.DynaProperty;
- /**
- * <p>
- * An implementation of {@code DynaClass} which combines the properties of multiple other {@code DynaClass} instances.
- * </p>
- *
- * @since 2.0
- */
- final class MultiWrapDynaClass implements DynaClass {
- /** An empty array for converting the properties collection to an array. */
- private static final DynaProperty[] EMPTY_PROPS = {};
- /** A collection with all properties of this class. */
- private final Collection<DynaProperty> properties;
- /** A map for accessing properties by name. */
- private final Map<String, DynaProperty> namedProperties;
- /**
- * Creates a new instance of {@code MultiWrapDynaClass} and initializes it with the collection of classes to be wrapped.
- *
- * @param wrappedCls the collection with wrapped classes
- */
- public MultiWrapDynaClass(final Collection<? extends DynaClass> wrappedCls) {
- properties = new LinkedList<>();
- namedProperties = new HashMap<>();
- initProperties(wrappedCls);
- }
- @Override
- public DynaProperty[] getDynaProperties() {
- return properties.toArray(EMPTY_PROPS);
- }
- @Override
- public DynaProperty getDynaProperty(final String name) {
- return namedProperties.get(name);
- }
- /**
- * {@inheritDoc} The name of this class is not relevant.
- */
- @Override
- public String getName() {
- return null;
- }
- /**
- * Initializes the members related to the properties of the wrapped classes.
- *
- * @param wrappedCls the collection with the wrapped classes
- */
- private void initProperties(final Collection<? extends DynaClass> wrappedCls) {
- wrappedCls.forEach(cls -> Stream.of(cls.getDynaProperties()).forEach(p -> {
- properties.add(p);
- namedProperties.put(p.getName(), p);
- }));
- }
- /**
- * {@inheritDoc} This implementation always throws an exception because it is not possible to instantiate a bean of
- * multiple classes.
- */
- @Override
- public DynaBean newInstance() throws IllegalAccessException, InstantiationException {
- throw new UnsupportedOperationException("Cannot create an instance of MultiWrapDynaBean!");
- }
- }