package journal.action; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import jargs.gnu.CmdLineParser; import journal.reader.ActionType; import journal.reader.DataJournalEntry; import journal.reader.JournalEntry; import journal.reader.Options; import journal.schema.TableVersion; public class ClientUserRenamer extends BaseAction { boolean patch; boolean renameUser; boolean renameClient; String fileName = ""; Map<String, String> renameMap = new HashMap<String, String>(); private static class Counter { int clients = 0; int users = 0; void incrementClient() { clients++; } void incrementUser() { users++; } public String toString() { return "clients = " + clients + " users = " + users; } } Map<String, Counter> counter = new HashMap<String, Counter>(); @Override public void start(Options options) throws Exception { super.start(options); // need to rethink the whole option vs command line arguments issue. } @Override public void help() { System.err.println("\t--action journal.action.ClientUserRenamer -- <options>"); System.err.println("\t\tOptions are\n"); System.err.println("\t\t-c --client"); System.err.println("\t\t-u --user"); System.err.println("\t\t-o --oldName[=]<old-name> -n --newName[=]<new-name>"); System.err.println("\t\t-f --fileName[=]<file-name> # format: oldname=newname"); System.err.println("\t\t-p --patch"); } @Override public void finish() throws Exception { System.err.println("\nRenamed the following : "); for (Map.Entry<String, Counter> entry : counter.entrySet()) { System.err.println(entry.getKey() + " -> " + renameMap.get(entry.getKey()) + " : " + entry.getValue()); } } @Override public String[] parseArgs(String[] args) { CmdLineParser parser = new CmdLineParser(); CmdLineParser.Option oldNameOption = parser.addStringOption('o', "oldName"); CmdLineParser.Option newNameOption = parser.addStringOption('n', "newName"); CmdLineParser.Option fileNameOption = parser.addStringOption('f', "fileName"); CmdLineParser.Option patchOption = parser.addBooleanOption('p', "patch"); CmdLineParser.Option userOption = parser.addBooleanOption('u', "user"); CmdLineParser.Option clientOption = parser.addBooleanOption('c', "client"); try { parser.parse(args); } catch ( CmdLineParser.OptionException e ) { System.err.println(e.getMessage()); help(); System.exit(2); } String oldName = (String) parser.getOptionValue(oldNameOption, ""); String newName = (String) parser.getOptionValue(newNameOption, ""); fileName = (String) parser.getOptionValue(fileNameOption, fileName); this.patch = (Boolean) parser.getOptionValue(patchOption, Boolean.FALSE); this.renameUser = (Boolean) parser.getOptionValue(userOption, Boolean.FALSE); this.renameClient = (Boolean) parser.getOptionValue(clientOption, Boolean.FALSE); // verify that the correct options match up if( !renameUser && !renameClient ) { throw new IllegalArgumentException("Need to specify at least one of [--user|--client]"); } if( fileName.equals("") ) { if( oldName.equals("") || newName.equals("")) { throw new IllegalArgumentException("Need to specify either filename or old and new name"); } renameMap.put(oldName, newName); } else { try { readFile(fileName); } catch(IOException e) { throw new IllegalArgumentException("Illegal filename", e); } } for (String name : renameMap.keySet()) { counter.put(name, new Counter()); } return parser.getRemainingArgs(); } private void readFile(final String fileName) throws IOException { Properties p = new Properties(); FileReader r = new FileReader(fileName); p.load(r); for (Enumeration<?> propNames = p.propertyNames(); propNames.hasMoreElements(); ) { String name = (String) propNames.nextElement(); renameMap.put(name, p.getProperty(name)); } } // RenameAction interfaces and inner classes private Map<TableVersion, RenameAction> actionMap = new HashMap<TableVersion, RenameAction>(); private interface RenameAction { boolean rename(DataJournalEntry data); } static class CompoundActions implements RenameAction { public boolean rename(DataJournalEntry data) { boolean renamed = false; for( RenameAction action : list) { renamed = renamed | action.rename(data); } return renamed; } private List<RenameAction> list = null; CompoundActions(List<RenameAction> actions) { list = actions; } } class SimpleRenameAction implements RenameAction { private String field; public boolean rename(DataJournalEntry data) { String value = (String) data.getValue(field); if( renameMap.containsKey(value) ) { value = renameMap.get(value); data.setValue(field, value); return true; } return false; } SimpleRenameAction(String field) { this.field = field; } } class FileRenameAction implements RenameAction { private String field; public boolean rename(DataJournalEntry data) { String file = (String) data.getValue(field); if( file.length() > 0 && file.charAt(0) == '/') { String value = file.substring(2, file.indexOf('/', 2)); if( renameMap.containsKey(value) ) { String newValue = renameMap.get(value); String newValueFile = file.replaceFirst("//"+value+"/", "//" + newValue + "/"); data.setValue(field, newValueFile); return true; } } return false; } FileRenameAction(String field) { this.field = field; } } static class EmptyAction implements RenameAction { public boolean rename(DataJournalEntry data) { return false; } private EmptyAction() { } public static final EmptyAction instance = new EmptyAction(); } RenameAction getAction(TableVersion version) { if( !actionMap.containsKey(version)) { RenameAction action = EmptyAction.instance; List<RenameAction> list = new ArrayList<RenameAction>(); if( renameClient ) { if( version.getAttributeByName("client") != null ) { list.add( new SimpleRenameAction("client") ); } if( version.getAttributeByName("cfile") != null) { list.add( new FileRenameAction("cfile")); } if( version.getTable().getName().equals("db.view")) { list.add( new SimpleRenameAction("name")); list.add( new FileRenameAction("vfile")); } } if( renameUser ) { if( version.getAttributeByName("user") != null ) { list.add( new SimpleRenameAction("user") ); } if( version.getAttributeByName("owner") != null ) { list.add( new SimpleRenameAction("owner") ); } } if( list.size() == 1 ) { action = list.get(0); } else if ( list.size() > 1 ) { action = new CompoundActions(list); } actionMap.put(version, action); } return actionMap.get(version); } @Override public void putValue(JournalEntry entry) throws Exception { DataJournalEntry data = (DataJournalEntry) entry; TableVersion version = data.getTableVersion(); RenameAction action = getAction(version); boolean renamed = action.rename(data); if( renamed && patch) { out.println(data.toJournalString(ActionType.DELETE_VALUE)); } if( renamed || !patch ) { out.println(data.toJournalString()); } } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#5 | 8016 | Sven Erik Knop | In the middle of refactoring the Renamer classes into the BaseRenamer. | ||
#4 | 8015 | Sven Erik Knop | Now with counter reestablished. | ||
#3 | 8014 | Sven Erik Knop |
Extracted a base class. Not quite finished since I need a counter class as well. |
||
#2 | 8013 | Sven Erik Knop |
Rewrite of ClientUserRenamer. Now based on a saner model using a set of Actions instead of lots of state variables. Note that the counter currently does not work and simply returns 0 changes. |
||
#1 | 8012 | Sven Erik Knop | Rename Renamer to ClientUserRenamer for clarification. | ||
//guest/sven_erik_knop/java/JournalReader/src/journal/action/Renamer.java | |||||
#3 | 7823 | Sven Erik Knop |
Updated the Renamer tool to solve the problem that owners of specs such as labels and client workspaces wouldn't get updated. Jar file with updated version submitted as well. |
||
#2 | 7626 | Sven Erik Knop |
Removed obsolete imports. Added jar file manifest to build.xml |
||
#1 | 7527 | Sven Erik Knop |
JournalReader, now in its proper place. Documentation to follow. |