001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *   http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    
020    package org.apache.fulcrum.yaafi.framework.util;
021    
022    /**
023     * A simple replacement for the more involved version in commons-lang; this is used
024     * to help construct the description string returned by an object's
025     * <code>toString()</code> method.
026     *
027     * The code was pasted from the Hivemind container written by
028     * Howard Lewis Ship.
029     *
030     * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
031     */
032    public class ToStringBuilder
033    {
034        private StringBuffer buffer = new StringBuffer();
035    
036        private int mode;
037        private int attributeCount;
038    
039        private static int defaultMode = 0x03;
040    
041        public static final int INCLUDE_PACKAGE_PREFIX = 0x1;
042        public static final int INCLUDE_HASHCODE = 0x02;
043    
044        public ToStringBuilder(Object target)
045        {
046            this(target, defaultMode);
047        }
048    
049        public ToStringBuilder(Object target, int mode)
050        {
051            this.mode = mode;
052    
053            appendClassName(target);
054            appendHashCode(target);
055        }
056    
057        private void appendHashCode(Object target)
058        {
059            if ((this.mode & INCLUDE_HASHCODE) == 0)
060                return;
061    
062            this.buffer.append('@');
063            this.buffer.append(Integer.toHexString(target.hashCode()));
064        }
065    
066        private void appendClassName(Object target)
067        {
068            String className = target.getClass().getName();
069    
070            if ((this.mode & INCLUDE_PACKAGE_PREFIX) != 0)
071            {
072                this.buffer.append(className);
073                return;
074            }
075    
076            int lastdotx = className.lastIndexOf('.');
077    
078            this.buffer.append(className.substring(lastdotx + 1));
079        }
080    
081        public static int getDefaultMode()
082        {
083            return defaultMode;
084        }
085    
086        public static void setDefaultMode(int i)
087        {
088            defaultMode = i;
089        }
090    
091        /**
092         * Returns the final assembled string. This may only be invoked once, after
093         * all attributes have been appended.
094         */
095        public String toString()
096        {
097            if (this.attributeCount > 0)
098                this.buffer.append(']');
099    
100            String result = this.buffer.toString();
101    
102            this.buffer = null;
103    
104            return result;
105        }
106    
107        public void append(String attributeName, boolean value)
108        {
109            append(attributeName, String.valueOf(value));
110        }
111    
112        public void append(String attributeName, byte value)
113        {
114            append(attributeName, String.valueOf(value));
115    
116        }
117        public void append(String attributeName, short value)
118        {
119            append(attributeName, String.valueOf(value));
120        }
121    
122        public void append(String attributeName, int value)
123        {
124            append(attributeName, String.valueOf(value));
125        }
126    
127        public void append(String attributeName, Object value)
128        {
129            append(attributeName, String.valueOf(value));
130        }
131    
132        public void append(String attributeName, String value)
133        {
134            if (this.attributeCount++ == 0)
135                this.buffer.append('[');
136    
137            else
138                this.buffer.append(' ');
139    
140            this.buffer.append(attributeName);
141    
142            this.buffer.append('=');
143    
144            this.buffer.append(value);
145        }
146    }