buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/AntComment.java
author wbernard
Fri, 13 Aug 2010 14:59:05 +0300
changeset 628 7c4a911dc066
parent 588 c7c26511138f
permissions -rw-r--r--
helium_11.0.0-e00f171ca185
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     1
/*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     2
 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     3
 * All rights reserved.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     5
 * under the terms of the License "Eclipse Public License v1.0"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     8
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     9
 * Initial Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    11
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    12
 * Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    13
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    14
 * Description: 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    15
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    16
 */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    17
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    18
package com.nokia.helium.ant.data;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    19
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    20
import java.text.BreakIterator;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    21
import java.util.HashMap;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    22
import java.util.StringTokenizer;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    23
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    24
import org.apache.log4j.Logger;
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    25
import org.dom4j.Comment;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    26
import org.dom4j.Node;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    27
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    28
/**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    29
 * An XML comment about an Ant object, which could be a property, target,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    30
 * fileset, etc. It should preceed the object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    31
 */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    32
public class AntComment {
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    33
    private static Logger log = Logger.getLogger(AntComment.class);
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    34
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    35
    private String summary = "";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    36
    private String parsedDocText = "";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    37
    private HashMap<String, String> tags;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    38
    private String objectName = "";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    39
    private boolean isMarkedComment;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    40
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    41
    public AntComment() {
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    42
        this(null);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    43
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    44
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    45
    public AntComment(Comment comment) {
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    46
        tags = new HashMap<String, String>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    47
        if (comment != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    48
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    49
            String text = getCleanedDocNodeText(comment);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    50
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    51
            // See if it is a marked comment (a comment that is only
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    52
            // intended to be for documentation generation)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    53
            if (text.startsWith("*")) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    54
                text = text.substring(1).trim();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    55
                isMarkedComment = true;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    56
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    57
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    58
            // See if it is a comment describing an object not defined in Helium
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    59
            // Currently only properties are supported
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    60
            if (text.startsWith("@property")) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    61
                String[] splitStrings = text.split("\\s", 3);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    62
                objectName = splitStrings[1];
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    63
                if (objectName == null) {
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    64
                    log.warn("Comment block: object name is not defined.");
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    65
                    objectName = "";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    66
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    67
                if (splitStrings.length > 2) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    68
                    text = splitStrings[2];
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    69
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    70
                else {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    71
                    text = "";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    72
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    73
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    74
            parseCommentText(text);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    75
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    76
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    77
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    78
    private void parseCommentText(String text) {
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    79
        if (text.length() > 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    80
            StringTokenizer tokenizer = new StringTokenizer(text, "@");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    81
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    82
            // Parse any free text before the tags
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    83
            if (!text.startsWith("@")) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    84
                String freeText = tokenizer.nextToken();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    85
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    86
                BreakIterator iterator = BreakIterator.getSentenceInstance();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    87
                iterator.setText(freeText);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    88
                if (iterator.next() > 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    89
                    this.summary = freeText.substring(0, iterator.current()).trim();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    90
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    91
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    92
                parsedDocText = freeText;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    93
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    94
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    95
            // See if there are any tags to parse
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    96
            if (tokenizer.countTokens() > 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    97
                while (tokenizer.hasMoreElements()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    98
                    String tagText = (String) tokenizer.nextElement();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    99
                    String[] tagParts = tagText.split("\\s", 2);
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   100
                    if (tagParts.length > 1) {
588
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents: 587
diff changeset
   101
                        tags.put(tagParts[0], tagParts[1].trim());
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   102
                    }
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   103
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   104
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   105
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   106
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   107
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   108
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   109
     * The summary text of the comment, which is the first sentence.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   110
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   111
     * @return The first comment sentence.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   112
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   113
    public String getSummary() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   114
        return summary;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   115
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   116
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   117
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   118
     * The full documentation text of the comment.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   119
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   120
     * @return The doc text.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   121
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   122
    public String getDocumentation() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   123
        return parsedDocText;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   124
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   125
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   126
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   127
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   128
     * The value of a comment tag that is used to describe a specific attribute
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   129
     * of the Ant object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   130
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   131
     * @param tag The tag name.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   132
     * @return The value of the tag.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   133
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   134
    public String getTagValue(String tag) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   135
        return getTagValue(tag, "");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   136
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   137
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   138
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   139
     * The value of a comment tag that is used to describe a specific attribute
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   140
     * of the Ant object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   141
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   142
     * @param tag The tag name.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   143
     * @return The value of the tag.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   144
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   145
    public String getTagValue(String tag, String defaultValue) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   146
        String value = (String) tags.get(tag);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   147
        if (value == null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   148
            value = defaultValue;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   149
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   150
        return value;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   151
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   152
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   153
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   154
     * Returns the name of the object when the object is defined only by a
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   155
     * comment.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   156
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   157
     * @return An object name.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   158
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   159
    public String getObjectName() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   160
        return objectName;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   161
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   162
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   163
    public boolean isMarkedComment() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   164
        return isMarkedComment;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   165
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   166
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   167
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   168
     * Clean the whitespace of the doc text.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   169
     * Trim the whole string and also remove a consistent indent from the start
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   170
     * of each line.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   171
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   172
    static String getCleanedDocNodeText(Node docNode) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   173
        Node preceedingWhitespaceNode = docNode.selectSingleNode("preceding-sibling::text()");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   174
        int indent = 0;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   175
        if (preceedingWhitespaceNode != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   176
            String text = preceedingWhitespaceNode.getText();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   177
            String[] lines = text.split("\n");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   178
            if (lines.length > 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   179
                indent = lines[lines.length - 1].length();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   180
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   181
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   182
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   183
        String text = docNode.getText();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   184
        text = text.trim();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   185
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   186
        String[] docLines = text.split("\n");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   187
        // Do not remove from the first line, it is already trimmed.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   188
        text = docLines[0] + "\n";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   189
        for (int i = 1; i < docLines.length; i++) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   190
            String line = docLines[i].replaceFirst("^[ \t]{" + indent + "}", "");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   191
            text += line + "\n";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   192
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   193
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   194
        return text;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   195
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   196
}