/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.netbeans.lib.cvsclient.command;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.Map;
import java.util.StringTokenizer;
import org.netbeans.lib.cvsclient.ClientServices;
import org.netbeans.lib.cvsclient.util.SimpleStringPattern;
/**
* Support for <tt>.cvswrappers</tt> parsing and merging.
*/
public class WrapperUtils {
/**
* Reads the wrappers from the specified source and populates the specified map
*
* @param reader
* The source of wrappers which is being processed
* @param theMap
* The map which is being updated
*/
private static void parseWrappers(BufferedReader reader, Map theMap) throws IOException {
String line;
while ((line = reader.readLine()) != null) {
StringTokenizer tokenizer = new StringTokenizer(line);
// the first token is the pattern
SimpleStringPattern pattern = new SimpleStringPattern(tokenizer.nextToken());
// it is followed by option value pairs
String option, value;
while (tokenizer.hasMoreTokens()) {
option = tokenizer.nextToken();
value = tokenizer.nextToken();
// do not bother with the -m Options now
if (option.equals("-k")) { // NOI18N
// This is a keyword substitution option
// strip the quotes
int first = value.indexOf('\'');
int last = value.lastIndexOf('\'');
if (first >= 0 && last >= 0) {
value = value.substring(first + 1, last);
}
KeywordSubstitutionOptions keywordOption = KeywordSubstitutionOptions.findKeywordSubstOption(value);
if (!theMap.containsKey(pattern)) {
theMap.put(pattern, keywordOption);
}
}
}
}
}
/**
* Reads the wrappers from the specified file and populates the specified map
*
* @param file
* The File object corresponding to the file which is being processed
* @param wrapperMap
* The map which is being updated
*/
public static void readWrappersFromFile(File file, Map wrapperMap) throws IOException, FileNotFoundException {
parseWrappers(new BufferedReader(new FileReader(file)), wrapperMap);
}
/**
* Reads the wrappers from the specified System property and populates the specified map. The map is unchanged if the property is not
* set.
*
* @param envVar
* The system variable name
* @param wrapperMap
* The map which is being updated
*/
private static void readWrappersFromProperty(String envVar, Map wrapperMap) throws IOException {
String propertyValue = System.getenv(envVar);
if (propertyValue != null) {
parseWrappers(new BufferedReader(new StringReader(propertyValue)), wrapperMap);
}
}
/**
* This method consolidates the wrapper map so that it follows CVS prioritization rules for the wrappers. Both AddCommand and
* ImportCommand will be calling this.
*/
public static Map mergeWrapperMap(ClientServices client) throws CommandException {
String wrapperSource = null;
Map wrappersMap = new java.util.HashMap(client.getWrappersMap());
try {
File home = new File(System.getProperty("user.home")); // NOI18N
File wrappers = new File(home, "./cvswrappers"); // NOI18N
wrapperSource = CommandException.getLocalMessage("WrapperUtils.clientDotWrapper.text"); // NOI18N
if (wrappers.exists()) {
readWrappersFromFile(wrappers, wrappersMap);
}
wrapperSource = CommandException.getLocalMessage("WrapperUtils.environmentWrapper.text"); // NOI18N
// process the Environment variable CVSWRAPPERS
readWrappersFromProperty("CVSWRAPPERS", wrappersMap); // NOI18N
} catch (FileNotFoundException fnex) {
// should not happen as we check for file existence. Even if it does
// it just means the .cvswrappers are not there and can be ignored
} catch (Exception ioex) {
Object[] parms = new Object[1];
parms[0] = wrapperSource;
String localizedMessage = CommandException.getLocalMessage("WrapperUtils.wrapperError.text", parms); // NOI18N
throw new CommandException(ioex, localizedMessage);
}
return wrappersMap;
}
}