fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * The contents of this file are subject to the terms
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * of the Common Development and Distribution License
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * (the License). You may not use this file except in
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * compliance with the License.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * You can obtain a copy of the License at
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * https://opensso.dev.java.net/public/CDDLv1.0.html or
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * See the License for the specific language governing
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * permission and limitations under the License.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * When distributing Covered Code, include this CDDL
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * Header Notice in each file and include the License file
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * If applicable, add the following below the CDDL Header,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * with the fields enclosed by brackets [] replaced by
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * your own identifying information:
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * "Portions Copyrighted [year] [name of copyright owner]"
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * $Id: FileEditor.java,v 1.2 2008/06/25 05:51:29 qcheng Exp $
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * Class that provides functionality to match the "lines" with specified
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * pattern and remove them from the specified file.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * @param matchPatterns
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * a Set of DeletePatterns
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * @return true if all the patterns were found and deleted. False if some
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * patterns were not found. In such cases no changes are made to
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * @throws Exception
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major public boolean deleteLines(Set matchPatterns) throws Exception {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean success = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Map patternOccurrances = getPatternOccurences(matchPatterns);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (patternOccurrances.size() == matchPatterns.size()) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major TreeSet removeLines = addSuccessiveDeleteLines(matchPatterns,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major public boolean deleteLines(DeletePattern pattern) throws Exception {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Map patternOccurrances = getPatternOccurences(matchPatterns);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean success = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (patternOccurrances.size() == 1) { // Just one match should be
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major TreeSet removeLines = addSuccessiveDeleteLines(matchPatterns,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major private TreeSet addSuccessiveDeleteLines(Set matchPatterns,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major TreeSet removeLines = new TreeSet(patternOccurrances.values());
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Integer lineNumber = (Integer) patternOccurrances.get(dp
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major int numSuccessiveLines = dp.getNumberOfSuccessiveLines();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major removeLines.add(new Integer(lineNumber.intValue() + i));
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major private boolean deleteLineNumbers(TreeSet lineNumbers) throws Exception {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major // Get the line numbers and sort them using TreeSet
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Debug.log("FileEditor.deleteLineNumbers() - Lines that "
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major TreeSet removeLineNumbers = new TreeSet(lineNumbers);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major FileInputStream fi = new FileInputStream(getFileName());
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major InputStreamReader ir = new InputStreamReader(fi);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major FileOutputStream fo = new FileOutputStream(getTempFileName());
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major OutputStreamWriter ow = new OutputStreamWriter(fo);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Integer removeLine = (Integer) removeLineNumbers.first();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major while ((lineData = reader.readLine()) != null) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major removeLine = verifyAndDeleteLine(reader, writer, lineData,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } catch (Exception e) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Debug.log("FileEditor.removeLines() - Exception occurred "
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major + "while removing lines from file. " + getFileName(), e);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major // Delete the original file and rename temp file as original
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major return removeLineNumbers.isEmpty(); // If empty then successful
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major private Integer verifyAndDeleteLine(LineNumberReader reader,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major BufferedWriter writer, String lineData, TreeSet removeLineNumbers,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (!removeLineNumbers.isEmpty() && removeLine.intValue() ==
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major // Determine next line to skip from being written to file
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Debug.log("FileEditor.skipLinesAndCreateTempFile() - "
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major + "Skipping line[" + lineNumber + "]=" + lineData);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major nextLineToRemove = (Integer) removeLineNumbers.first();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major public Map getPatternOccurences(Set matchPatterns) throws Exception {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean matchFound = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major // A Map which stores key=value as
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major // pattern-string=line-number-to-be-removed
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major while ((lineData = reader.readLine()) != null) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major matchAndAddLineNumbers(matchPatterns, lineData, lineNumber,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } catch (Exception e) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Debug.log("FileEditor.getPatternOccurences() - Exception "
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major + "occurred while searching for patterns. ", e);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major private void matchAndAddLineNumbers(Set matchPatterns, String lineData,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean isFound = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major // Iterate through all active patterns and see if they are present
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major MatchPattern matchPattern = (MatchPattern) iter.next();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (matchPattern.isActive() && matchPattern.isPresent(lineData)) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Debug.log("FileEditor.matchAndAddLineNumbers() - Found "
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major // Add the pattern & line number to the Map.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major matchedLines.put(matchPattern.getPattern(), number);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (!matchPattern.isMatchForLastOccurranceInFile()) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major // We don't want this match to be active anymore as the
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major // first occurance is already found.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major Debug.log("FileEditor.printMap() - " + me.getKey() + "="
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major public static final String LINE_SEP = System.getProperty("line.separator");
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major public static final String STR_TEMP_FILE_SUFFIX = ".tmp";