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.interceptor.util;
021    
022    import java.lang.reflect.Method;
023    
024    import org.apache.fulcrum.yaafi.framework.util.StringUtils;
025    
026    /**
027     * Creates a string representation of java.lang.reflect.Method
028     *
029     * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
030     */
031    public class MethodToStringBuilderImpl implements InterceptorToStringBuilder
032    {
033        /** include the method return type */
034        public static final int INCLUDE_RETURNTYPE = 0x1;
035    
036        /** the default mode using class names and hashcode */
037        private static int defaultMode = 0x01;
038    
039        /** our current formatting mode */
040        private int mode;
041    
042        /** initial size for the StringBuffer */
043        private static final int BUF_SIZE = 512;
044    
045        /** the method we are dumping */
046        private Method method;
047    
048        /**
049         * Constructor
050         */
051        public MethodToStringBuilderImpl()
052        {
053            this.mode = MethodToStringBuilderImpl.defaultMode;
054        }
055    
056        /**
057         * Constructor
058         *
059         * @param method the method to print
060         */
061        public MethodToStringBuilderImpl(Method method)
062        {
063            this.method = method;
064            this.mode = MethodToStringBuilderImpl.defaultMode;
065        }
066    
067        /**
068         * Constructor
069         *
070         * @param method the method to print
071         * @param mode the formatting mode
072         */
073        public MethodToStringBuilderImpl(Method method, int mode)
074        {
075            this.method = method;
076            this.mode = mode;
077        }
078    
079        /**
080         * @see org.apache.fulcrum.yaafi.interceptor.util.InterceptorToStringBuilder#setMaxArgLength(int)
081         */
082        public void setMaxArgLength(int maxArgLength)
083        {
084                // not supported
085        }
086    
087        /**
088         * @see org.apache.fulcrum.yaafi.interceptor.util.InterceptorToStringBuilder#setMode(int)
089         */
090        public void setMode(int mode)
091        {
092                this.mode = mode;
093        }
094    
095        /**
096         * @see org.apache.fulcrum.yaafi.interceptor.util.InterceptorToStringBuilder#setTarget(java.lang.Object)
097         */
098        public void setTarget(Object target)
099        {
100                this.method = (Method) target;
101        }
102    
103        /**
104         * @see java.lang.Object#toString()
105         */
106        public String toString()
107        {
108            try
109            {
110                StringBuffer buffer = new StringBuffer(BUF_SIZE);
111    
112                Class returnType = method.getReturnType();
113                Class declaringClass = method.getDeclaringClass();
114                Class[] params = method.getParameterTypes();
115    
116                // print return type
117    
118                if ((this.mode & INCLUDE_RETURNTYPE) == 1)
119                {
120                    buffer.append( this.stripDefaultPackage(returnType.getName()));
121                    buffer.append( ' ');
122                }
123    
124                // print class and method
125    
126                buffer.append( this.stripDefaultPackage(declaringClass.getName()));
127                buffer.append( '.');
128                buffer.append( method.getName() );
129                buffer.append( '(');
130    
131                // print the argument list of the method
132    
133                for (int i = 0; i < params.length; i++)
134                {
135                    buffer.append( this.stripDefaultPackage(params[i].getName()) );
136                    if (i < (params.length - 1))
137                    {
138                        buffer.append(",");
139                    }
140                }
141    
142                buffer.append(")");
143    
144                return buffer.toString();
145            }
146            catch (Throwable t)
147            {
148                return "<" + t + ">";
149            }
150        }
151    
152        /**
153         * Strips "java.lang" from the argument other than arrays
154         */
155        private String stripDefaultPackage( String arg )
156        {
157            if( arg.charAt(0) == '[' )
158            {
159                // this is an array
160                return StringUtils.replaceChars(arg,';','#');
161            }
162            else
163            {
164                return StringUtils.replace( arg, "java.lang.", "");
165            }
166        }
167    }