001// Copyright 2007, 2008, 2011 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007// http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry5.javadoc;
016
017import java.io.IOException;
018import java.io.Writer;
019import java.util.regex.Pattern;
020
021import com.sun.javadoc.FieldDoc;
022import com.sun.javadoc.SeeTag;
023import com.sun.javadoc.Tag;
024
025public class ParameterDescription
026{
027    public final FieldDoc field;
028
029    public final String name;
030
031    public final String type;
032
033    public final String defaultValue;
034
035    public final String defaultPrefix;
036
037    public final boolean required;
038
039    public final boolean allowNull;
040
041    public final boolean cache;
042
043    public final String since;
044
045    public final boolean deprecated;
046
047    private static final Pattern STRIPPER = Pattern.compile("(<.*?>|&.*?;)", Pattern.DOTALL);
048
049    public ParameterDescription(FieldDoc fieldDoc, String name, String type, String defaultValue, String defaultPrefix,
050            boolean required, boolean allowNull, boolean cache, String since, boolean deprecated)
051    {
052        this.field = fieldDoc;
053        this.name = name;
054        this.type = type;
055        this.defaultValue = defaultValue;
056        this.defaultPrefix = defaultPrefix;
057        this.required = required;
058        this.allowNull = allowNull;
059        this.cache = cache;
060        this.since = since;
061        this.deprecated = deprecated;
062    }
063
064    public void writeDescription(Writer writer) throws IOException
065    {
066        StringBuilder builder = new StringBuilder();
067
068        for (Tag tag : field.inlineTags())
069        {
070            if (tag.name().equals("Text"))
071            {
072                builder.append(tag.text());
073                continue;
074            }
075
076            if (tag.name().equals("@link"))
077            {
078                SeeTag seeTag = (SeeTag) tag;
079
080                String label = seeTag.label();
081                if (label != null && !label.equals(""))
082                {
083                    builder.append(label);
084                    continue;
085                }
086
087                if (seeTag.referencedClassName() != null)
088                    builder.append(seeTag.referencedClassName());
089
090                if (seeTag.referencedMemberName() != null)
091                {
092                    builder.append("#");
093                    builder.append(seeTag.referencedMemberName());
094                }
095            }
096        }
097
098        String text = builder.toString();
099
100        // Fix it up a little.
101
102        // Remove any simple open or close tags found in the text, as well as any XML entities.
103
104        String stripped = STRIPPER.matcher(text).replaceAll("");
105
106        writer.write(stripped);
107    }
108}