/*
* Copyright (C) 2001, 2002 Robert MacGrogan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*
* $Archive: SourceJammer$
* $FileName: KeywordManager.java$
* $FileID: 4475$
*
* Last change:
* $AuthorName: Rob MacGrogan$
* $Date: 9/5/03 12:34 PM$
* $Comment: Change path separator in location expander to semi-colon.$
*/
package org.sourcejammer.server.keywords;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.Vector;
import org.sourcejammer.util.BufferedLineReader;
import java.io.IOException;
import org.sourcejammer.project.controller.FileNode;
import org.sourcejammer.project.ArchiveInfo;
import org.sourcejammer.util.BadMethodArgumentException;
import org.sourcejammer.project.controller.ProjectNode;
import org.sourcejammer.project.model.NodeLibrary;
import org.sourcejammer.project.controller.ControllerUtil;
import org.sourcejammer.server.security.SecurityException;
import org.sourcejammer.project.controller.ProjectDoesNotExistException;
import org.sourcejammer.project.model.FileAccessException;
import org.sourcejammer.project.controller.NoSuchVersionException;
import org.sourcejammer.project.view.NodeInfo;
/**
* Title: $FileName: KeywordManager.java$
* @version $VerNum: 5$
* @author $AuthorName: Rob MacGrogan$<br><br>
*
* $Description: Parse and expand keywords.$<br>
* $KeyWordsOff: $
*/
public class KeywordManager implements KeywordTags {
private boolean lookForKeyWords = true;
private static final Hashtable keywords = buildKeywordsHash();
private static Hashtable buildKeywordsHash(){
Hashtable hsh = new Hashtable();
hsh.put(ARCHIVE_NAME, buildArchiveNameExpander());
hsh.put(OFF, buildDoNothingExpander());
hsh.put(FILE_ID, buildFileIDExpander());
hsh.put(FILE_LOCATION, buildFileLocationExpander());
hsh.put(FILE_NAME, buildFileNameExpander());
hsh.put(MODIFIED_DATE, buildModDateExpander());
hsh.put(VERSION_NUMBER, buildVerNumExpander());
hsh.put(VERSION_ID, buildVerIDExpander());
hsh.put(USER_NAME, buildUserNameExpander());
hsh.put(USER_FULL_NAME, buildUserFullNameExpander());
hsh.put(DESCRIPTION, buildDescriptionExpander());
hsh.put(LAST_COMMENT, buildCommentExpander());
hsh.put(HISTORY, new HistoryExpander());
/*
vec.add(KEYWORD_INDICATOR, HISTORY);
return vec;
*/
return hsh;
}
private static KeywordExpander buildUserFullNameExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
String value = obj.getUser().getFullName();
int iSepIndex = getSeparatorIndex(keywordBeginIndex, USER_FULL_NAME);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, USER_FULL_NAME);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
private static KeywordExpander buildUserNameExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
String value = obj.getUser().getUserName();
int iSepIndex = getSeparatorIndex(keywordBeginIndex, USER_NAME);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, USER_NAME);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
private static KeywordExpander buildVerIDExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
FileNode nd = obj.getFileNode();
String value = Long.toString(obj.getVersion().getUniqueID());
int iSepIndex = getSeparatorIndex(keywordBeginIndex, VERSION_ID);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, VERSION_ID);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
private static KeywordExpander buildVerNumExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
FileNode nd = obj.getFileNode();
int iVerNumber = nd.childCount();
//Check to see if version we have is in FileNode. If not, add 1 to
//version number. And yes, equality check is correct.
try{
if ( obj.getVersion() != nd.getLatestVersionNode() ){
iVerNumber++;
}
}
catch (NoSuchVersionException ex){
//If version is not there, we should incriment ver num.
iVerNumber++;
}
String value = Integer.toString(iVerNumber);
int iSepIndex = getSeparatorIndex(keywordBeginIndex, VERSION_NUMBER);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, VERSION_NUMBER);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
private static KeywordExpander buildModDateExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
FileNode nd = obj.getFileNode();
String value = obj.getVersion().getCreatedDate().toString();
int iSepIndex = getSeparatorIndex(keywordBeginIndex, MODIFIED_DATE);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, MODIFIED_DATE);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
private static KeywordExpander buildDescriptionExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
FileNode nd = obj.getFileNode();
String value = nd.getDescrption();
int iSepIndex = getSeparatorIndex(keywordBeginIndex, DESCRIPTION);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, DESCRIPTION);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
private static KeywordExpander buildCommentExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
String value = obj.getCurrentComment();
int iSepIndex = getSeparatorIndex(keywordBeginIndex, LAST_COMMENT);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, LAST_COMMENT);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
private static KeywordExpander buildFileNameExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
FileNode nd = obj.getFileNode();
String value = nd.getNodeName();
int iSepIndex = getSeparatorIndex(keywordBeginIndex, FILE_NAME);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, FILE_NAME);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
private static KeywordExpander buildFileLocationExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
System.out.println("--Expanding Location");
FileNode ndFile = obj.getFileNode();
NodeLibrary lib = obj.getLibrary();
try{
long[] parentIDs = ndFile.getParentsArray();
StringBuffer str = new StringBuffer();
for(int i = 0; i < parentIDs.length; i++){
long parentID = parentIDs[i];
ProjectNode parent = lib.getProjectNode(parentID);
String path = ControllerUtil.getPathFromProject(parent, lib);
if (i > 0){
str.append(";");
}
str.append(path);
}
String value = str.toString();
int iSepIndex = getSeparatorIndex(keywordBeginIndex, FILE_LOCATION);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, FILE_LOCATION);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
catch (SecurityException ex){
throw new KeywordExpansionException(ex.getMessage(), ex);
}
catch (ProjectDoesNotExistException ex){
throw new KeywordExpansionException(ex.getMessage(), ex);
}
catch (FileAccessException ex){
throw new KeywordExpansionException(ex.getMessage(), ex);
}
}
};
return expander;
}
private static KeywordExpander buildFileIDExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
FileNode nd = obj.getFileNode();
String value = Long.toString(nd.getUniqueID());
int iSepIndex = getSeparatorIndex(keywordBeginIndex, FILE_ID);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, FILE_ID);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
/**
* Adds archive name.
*/
private static KeywordExpander buildArchiveNameExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
String value = obj.getArchInfo().getArchiveName();
int iSepIndex = getSeparatorIndex(keywordBeginIndex, ARCHIVE_NAME);
String commentStyle = getBeginNewLineIndent(keywordBeginIndex, line, ARCHIVE_NAME);
return replaceKeywordWithValue(iSepIndex, value, lines, line, reader, commentStyle);
}
};
return expander;
}
/**
* Just adds line to lines.
*/
private static KeywordExpander buildDoNothingExpander(){
KeywordExpander expander = new KeywordExpander(){
public int expand(String line, int keywordBeginIndex,
Vector lines, ProjectObjects obj,
BufferedLineReader reader)
throws KeywordExpansionException, IOException{
lines.add(line);
return line.length();
}
};
return expander;
}
public KeywordManager() {
}
public boolean lookForKeyWords(){
return lookForKeyWords;
}
/**
* Returns null if no keyword in line.
*/
public KeywordInLine keywordInLine(String line){
KeywordInLine oReturn = null;
if (lookForKeyWords){
Enumeration enm = keywords.keys();
while(enm.hasMoreElements()){
String sKey = (String)enm.nextElement();
int index = line.indexOf(sKey);
if (index > -1 ){
//keyword found.
oReturn = new KeywordInLine();
oReturn.setExpander((KeywordExpander)keywords.get(sKey));
oReturn.setKeyword(sKey);
oReturn.setKeywordBeginIndex(index);
//Check if it's end of keywords.
if (sKey == OFF){
lookForKeyWords = false;
}
break;
}//end if keyword found.
}//end while.
}//end if look for keywords.
return oReturn;
}
}
|