KeywordManager.java :  » Source-Control » sourcejammer » org » sourcejammer » server » keywords » Java Open Source

Java Open Source » Source Control » sourcejammer 
sourcejammer » org » sourcejammer » server » keywords » KeywordManager.java
/*
 *  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;
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.