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 org.apache.commons.betwixt.AttributeDescriptor;
020    import org.apache.commons.betwixt.ElementDescriptor;
021    
022    /**
023     * Determines whether the expression of an attribute with a values 
024     * should be suppressed.
025     *
026     * @since 0.7 
027     * @author <a href='http://commons.apache.org'>Apache Commons Team</a>, <a href='http://www.apache.org'>Apache Software Foundation</a>
028     */
029    public abstract class ValueSuppressionStrategy {
030        
031        /**
032         * Strategy allows all values to be expressed for all attributes
033         */
034        public static final ValueSuppressionStrategy ALLOW_ALL_VALUES = new ValueSuppressionStrategy() {
035            public boolean suppressAttribute(AttributeDescriptor attributeDescriptor, String value) {
036                return false;
037            }
038        };
039    
040        /**
041         * Suppresses all null values.
042         */
043        public static final ValueSuppressionStrategy SUPPRESS_EMPTY = new ValueSuppressionStrategy() {
044            public boolean suppressAttribute(AttributeDescriptor attributeDescriptor, String value) {
045                return "".equals(value);
046            } 
047        };
048        
049        /**
050         * Default strategy is {@link #SUPPRESS_EMPTY}.
051         */
052        public static final ValueSuppressionStrategy DEFAULT = SUPPRESS_EMPTY;
053    
054        
055        /**
056         * Should the given attribute value be suppressed?
057         * @param attributeDescriptor <code>AttributeDescriptor</code> describing the attribute, not null
058         * @param value <code>Object</code> value, possibly null
059         * @return true if the attribute should not be written for the given value
060         */
061        public abstract boolean suppressAttribute(AttributeDescriptor attributeDescriptor, String value);
062    
063        /**
064         * <p>
065         * Should be given element value be suppressed?
066         * </p><p>
067         * <strong>Note:</strong> to preserve binary compatibility,
068         * this method contains an implementation that returns false.
069         * Subclasses should not rely upon this behaviour as (in future)
070         * this may be made abstract. 
071         * </p>
072         * @param element <code>ElementDescriptor</code> describing the element, not null
073         * @param namespaceUri the namespace of the element to be written
074         * @param localName the local name of the element to be written
075         * @param qualifiedName the qualified name of the element to be written
076         * @param value <code>Object</code> value, possibly null
077         * @return true if the element should be suppressed (in other words, not written)
078         * for the given value
079         * @since 0.8
080         */
081        public boolean suppressElement(ElementDescriptor element, String namespaceUri, String localName, String qualifiedName, Object value) {
082             return false;
083        }
084    }