001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.commons.betwixt.strategy;
018:
019: import java.util.ArrayList;
020: import java.util.Collection;
021: import java.util.Iterator;
022: import java.util.List;
023:
024: /**
025: * Pluggable strategy specifying whether property's should be suppressed.
026: * Implementations can be used to give rules about which properties
027: * should be ignored by Betwixt when introspecting.
028: * @since 0.7
029: * @author <a href='http://jakarta.apache.org/commons'>Jakarta Commons Team</a>, <a href='http://www.apache.org'>Apache Software Foundation</a>
030: */
031: public abstract class PropertySuppressionStrategy {
032:
033: /**
034: * Default implementation.
035: * @see #DEFAULT
036: */
037: public static class Default extends PropertySuppressionStrategy {
038: public boolean suppressProperty(Class clazz,
039: Class propertyType, String propertyName) {
040: boolean result = false;
041: // ignore class properties
042: if (Class.class.equals(propertyType)
043: && "class".equals(propertyName)) {
044: result = true;
045: }
046: // ignore isEmpty for collection subclasses
047: if ("empty".equals(propertyName)
048: && Collection.class.isAssignableFrom(clazz)) {
049: result = true;
050: }
051:
052: return result;
053: }
054:
055: public String toString() {
056: return "Default Properties Suppressed";
057: }
058: }
059:
060: /**
061: * Implementation delegates to a list of strategies
062: */
063: public static class Chain extends PropertySuppressionStrategy {
064:
065: private final List strategies = new ArrayList();
066:
067: /**
068: * @see #suppressProperty(Class, Class, String)
069: */
070: public boolean suppressProperty(
071: Class classContainingTheProperty, Class propertyType,
072: String propertyName) {
073: boolean result = false;
074: for (Iterator it = strategies.iterator(); it.hasNext();) {
075: PropertySuppressionStrategy strategy = (PropertySuppressionStrategy) it
076: .next();
077: if (strategy.suppressProperty(
078: classContainingTheProperty, propertyType,
079: propertyName)) {
080: result = true;
081: break;
082: }
083:
084: }
085: return result;
086: }
087:
088: /**
089: * Adds a strategy to the list
090: * @param strategy <code>PropertySuppressionStrategy</code>, not null
091: */
092: public void addStrategy(PropertySuppressionStrategy strategy) {
093: strategies.add(strategy);
094: }
095: }
096:
097: /**
098: * Default implementation suppresses the class property
099: * found on every object. Also, the <code>isEmpty</code>
100: * property is supressed for implementations of <code>Collection</code>.
101: */
102: public static final PropertySuppressionStrategy DEFAULT = new Default();
103:
104: /**
105: * Should the given property be suppressed?
106: * @param classContainingTheProperty <code>Class</code> giving the type of the bean containing the property <code>propertyName</code>
107: * @param propertyType <code>Class</code> giving the type of the property, not null
108: * @param propertyName the name of the property, not null
109: * @return true when the given property should be suppressed
110: */
111: public abstract boolean suppressProperty(
112: Class classContainingTheProperty, Class propertyType,
113: String propertyName);
114: }
|