1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * https://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.beanutils2; 18 19 import java.beans.IntrospectionException; 20 import java.util.Collection; 21 import java.util.Collections; 22 import java.util.HashSet; 23 import java.util.Objects; 24 import java.util.Set; 25 26 /** 27 * <p> 28 * A specialized {@code BeanIntrospector} implementation which suppresses some properties. 29 * </p> 30 * <p> 31 * An instance of this class is passed a set with the names of the properties it should process. During introspection of a bean class it removes all these 32 * properties from the {@link IntrospectionContext}. So effectively, properties added by a different {@code BeanIntrospector} are removed again. 33 * </p> 34 * 35 * @since 1.9.2 36 */ 37 public class SuppressPropertiesBeanIntrospector implements BeanIntrospector { 38 39 /** 40 * A specialized instance which is configured to suppress the special {@code class} properties of Java beans. Unintended access to the property 41 * {@code class} (which is common to all Java objects) can be a security risk because it also allows access to the class loader. Adding this instance as 42 * {@code BeanIntrospector} to an instance of {@code PropertyUtilsBean} suppresses the {@code class} property; it can then no longer be accessed. 43 */ 44 public static final SuppressPropertiesBeanIntrospector SUPPRESS_CLASS = new SuppressPropertiesBeanIntrospector(Collections.singleton("class")); 45 46 /** 47 * A specialized instance which is configured to suppress the special {@code class} properties of Java beans. Unintended access to the call for 48 * {@code declaringClass} (which is common to all Java {@code enum}) can be a security risk because it also allows access to the class loader. Adding this 49 * instance as {@code BeanIntrospector} to an instance of {@code PropertyUtilsBean} suppresses the {@code class} property; it can then no longer be 50 * accessed. 51 * 52 * @since 2.0.0-M2 53 */ 54 public static final SuppressPropertiesBeanIntrospector SUPPRESS_DECLARING_CLASS = new SuppressPropertiesBeanIntrospector( 55 Collections.singleton("declaringClass")); 56 57 /** A set with the names of the properties to be suppressed. */ 58 private final Set<String> propertyNames; 59 60 /** 61 * Creates a new instance of {@code SuppressPropertiesBeanIntrospector} and sets the names of the properties to be suppressed. 62 * 63 * @param propertiesToSuppress the names of the properties to be suppressed (must not be <strong>null</strong>) 64 * @throws IllegalArgumentException if the collection with property names is <strong>null</strong> 65 */ 66 public SuppressPropertiesBeanIntrospector(final Collection<String> propertiesToSuppress) { 67 Objects.requireNonNull(propertiesToSuppress, "propertiesToSuppress"); 68 propertyNames = Collections.unmodifiableSet(new HashSet<>(propertiesToSuppress)); 69 } 70 71 /** 72 * Returns a (unmodifiable) set with the names of the properties which are suppressed by this {@code BeanIntrospector}. 73 * 74 * @return a set with the names of the suppressed properties 75 */ 76 public Set<String> getSuppressedProperties() { 77 return propertyNames; 78 } 79 80 /** 81 * {@inheritDoc} This implementation removes all properties from the given context it is configured for. 82 */ 83 @Override 84 public void introspect(final IntrospectionContext icontext) throws IntrospectionException { 85 getSuppressedProperties().forEach(icontext::removePropertyDescriptor); 86 } 87 }