View Javadoc

1   /*
2    * Copyright 2012-2013 smartics, Kronseder & Reiner GmbH
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package de.smartics.properties.api.core.util;
17  
18  import java.util.regex.Matcher;
19  import java.util.regex.Pattern;
20  
21  import org.apache.commons.lang.StringUtils;
22  
23  /**
24   * Utilities to normalize Javadoc comments.
25   */
26  public final class JavadocCommentHelper
27  {
28    // ********************************* Fields *********************************
29  
30    // --- constants ------------------------------------------------------------
31  
32    /**
33     * The pattern matches inline Javadoc tags. In group 1 is the text that is to
34     * be used and surrounded with {@link #prefix1} and {@link #suffix1}, if there
35     * is no match for group 2. If group 2 is present, the text is to be used
36     * without prefix/suffix 2.
37     */
38    private static final Pattern INLINE_PATTERN = Pattern.compile(
39        "\\{@[\\w]+\\s*([#\\.\\w]+(\\([^)]*\\))?)\\s*([^}]+)?\\}", Pattern.MULTILINE);
40  
41    // --- members --------------------------------------------------------------
42  
43    /**
44     * The prefix for group 1 match.
45     */
46    private final String prefix1;
47  
48    /**
49     * The suffix for group 1 match.
50     */
51    private final String suffix1;
52  
53    /**
54     * The prefix for group 2 match.
55     */
56    private final String prefix2;
57  
58    /**
59     * The suffix for group 2 match.
60     */
61    private final String suffix2;
62  
63    // ****************************** Initializer *******************************
64  
65    // ****************************** Constructors ******************************
66  
67    /**
68     * Default constructor.
69     *
70     * @param prefix1 the prefix for group 1 match.
71     * @param suffix1 the suffix for group 1 match.
72     * @param prefix2 the prefix for group 2 match.
73     * @param suffix2 the suffix for group 2 match.
74     */
75    public JavadocCommentHelper(final String prefix1, final String suffix1,
76        final String prefix2, final String suffix2)
77    {
78      this.prefix1 = prefix1;
79      this.suffix1 = suffix1;
80      this.prefix2 = prefix2;
81      this.suffix2 = suffix2;
82    }
83  
84    // ****************************** Inner Classes *****************************
85  
86    // ********************************* Methods ********************************
87  
88    // --- init -----------------------------------------------------------------
89  
90    // --- create ---------------------------------------------------------------
91  
92    /**
93     * Creates a default helper for normalizing in an HTML context.
94     *
95     * @return the HTML version of the helper.
96     */
97    public static JavadocCommentHelper createHtml()
98    {
99      return new JavadocCommentHelper("<tt>", "</tt>", "<i>", "</i>");
100   }
101 
102   /**
103    * Creates a default helper for normalizing in text context.
104    *
105    * @return the text version of the helper.
106    */
107   public static JavadocCommentHelper createText()
108   {
109     return new JavadocCommentHelper("'", "'", "", "");
110   }
111 
112   // --- get&set --------------------------------------------------------------
113 
114   // --- business -------------------------------------------------------------
115 
116   /**
117    * Replaces Javadoc inline tags.
118    *
119    * @param fragment the fragment with inline tags.
120    * @return the normalized fragment.
121    */
122   public String replaceJavadocInlines(final String fragment)
123   {
124     if (StringUtils.isBlank(fragment))
125     {
126       return fragment;
127     }
128 
129     final StringBuffer buffer = new StringBuffer(fragment.length());
130     final Matcher matcher = INLINE_PATTERN.matcher(fragment);
131 
132     while (matcher.find())
133     {
134       final String group2 = matcher.group(3);
135       if (group2 != null)
136       {
137         final String replacement = prefix2 + group2 + suffix2;
138         matcher.appendReplacement(buffer, replacement);
139       }
140       else
141       {
142         String group1 = matcher.group(1);
143         if (group1.length() > 1 && group1.charAt(0) == '#')
144         {
145           group1 = group1.substring(1);
146         }
147         final String replacement = prefix1 + group1 + suffix1;
148         matcher.appendReplacement(buffer, replacement);
149       }
150     }
151     matcher.appendTail(buffer);
152 
153     return buffer.toString();
154   }
155 
156   // --- object basics --------------------------------------------------------
157 
158 }