001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.lib.cvsclient.command.annotate;
042:
043: import java.io.*;
044:
045: import org.netbeans.lib.cvsclient.command.*;
046: import org.netbeans.lib.cvsclient.event.*;
047:
048: /**
049: * Handles the building of a annotate information object and the firing of
050: * events when complete objects are built.
051: *
052: * @author Milos Kleint
053: */
054: public class AnnotateBuilder implements Builder {
055: private static final String UNKNOWN = ": nothing known about"; //NOI18N
056: private static final String ANNOTATING = "Annotations for "; //NOI18N
057: private static final String STARS = "***************"; //NOI18N
058:
059: /**
060: * The Annotate object that is currently being built.
061: */
062: private AnnotateInformation annotateInformation;
063:
064: /**
065: * The event manager to use.
066: */
067: private final EventManager eventManager;
068:
069: private final String localPath;
070: private String relativeDirectory;
071: private int lineNum;
072: private File tempDir;
073:
074: public AnnotateBuilder(EventManager eventManager,
075: BasicCommand annotateCommand) {
076: this .eventManager = eventManager;
077: this .localPath = annotateCommand.getLocalDirectory();
078: tempDir = annotateCommand.getGlobalOptions().getTempDir();
079: }
080:
081: public void outputDone() {
082: if (annotateInformation == null) {
083: return;
084: }
085:
086: try {
087: annotateInformation.closeTempFile();
088: } catch (IOException exc) {
089: // ignore
090: }
091: eventManager.fireCVSEvent(new FileInfoEvent(this ,
092: annotateInformation));
093: annotateInformation = null;
094: }
095:
096: public void parseLine(String line, boolean isErrorMessage) {
097: if (isErrorMessage && line.startsWith(ANNOTATING)) {
098: outputDone();
099: annotateInformation = new AnnotateInformation(tempDir);
100: annotateInformation.setFile(createFile(line
101: .substring(ANNOTATING.length())));
102: lineNum = 0;
103: return;
104: }
105:
106: if (isErrorMessage && line.startsWith(STARS)) {
107: // skip
108: return;
109: }
110:
111: if (!isErrorMessage) {
112: processLines(line);
113: }
114: }
115:
116: private File createFile(String fileName) {
117: return new File(localPath, fileName);
118: }
119:
120: public void parseEnhancedMessage(String key, Object value) {
121: }
122:
123: private void processLines(String line) {
124: if (annotateInformation != null) {
125: try {
126: annotateInformation.addToTempFile(line);
127: } catch (IOException exc) {
128: // just ignore, should not happen.. if it does the worst thing that happens is a annotate info without data..
129: }
130: }
131: /*
132: AnnotateLine annLine = processLine(line);
133: if (annotateInformation != null && annLine != null) {
134: annLine.setLineNum(lineNum);
135: annotateInformation.addLine(annLine);
136: lineNum++;
137: }
138: */
139: }
140:
141: public static AnnotateLine processLine(String line) {
142: int indexOpeningBracket = line.indexOf('(');
143: int indexClosingBracket = line.indexOf(')');
144: AnnotateLine annLine = null;
145: if (indexOpeningBracket > 0
146: && indexClosingBracket > indexOpeningBracket) {
147: String revision = line.substring(0, indexOpeningBracket)
148: .trim();
149: String userDate = line.substring(indexOpeningBracket + 1,
150: indexClosingBracket);
151: String contents = line.substring(indexClosingBracket + 3);
152: int lastSpace = userDate.lastIndexOf(' ');
153: String user = userDate;
154: String date = userDate;
155: if (lastSpace > 0) {
156: user = userDate.substring(0, lastSpace).trim();
157: date = userDate.substring(lastSpace).trim();
158: }
159: annLine = new AnnotateLine();
160: annLine.setContent(contents);
161: annLine.setAuthor(user);
162: annLine.setDateString(date);
163: annLine.setRevision(revision);
164: }
165: return annLine;
166: }
167: }
|