/*******************************************************************************
* CogTool Copyright Notice and Distribution Terms
* CogTool 1.3, Copyright (c) 2005-2013 Carnegie Mellon University
* This software is distributed under the terms of the FSF Lesser
* Gnu Public License (see LGPL.txt).
*
* CogTool 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.
*
* CogTool 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 CogTool; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* CogTool makes use of several third-party components, with the
* following notices:
*
* Eclipse SWT version 3.448
* Eclipse GEF Draw2D version 3.2.1
*
* Unless otherwise indicated, all Content made available by the Eclipse
* Foundation is provided to you under the terms and conditions of the Eclipse
* Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this
* Content and is also available at http://www.eclipse.org/legal/epl-v10.html.
*
* CLISP version 2.38
*
* Copyright (c) Sam Steingold, Bruno Haible 2001-2006
* This software is distributed under the terms of the FSF Gnu Public License.
* See COPYRIGHT file in clisp installation folder for more information.
*
* ACT-R 6.0
*
* Copyright (c) 1998-2007 Dan Bothell, Mike Byrne, Christian Lebiere &
* John R Anderson.
* This software is distributed under the terms of the FSF Lesser
* Gnu Public License (see LGPL.txt).
*
* Apache Jakarta Commons-Lang 2.1
*
* This product contains software developed by the Apache Software Foundation
* (http://www.apache.org/)
*
* jopt-simple version 1.0
*
* Copyright (c) 2004-2013 Paul R. Holser, Jr.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Mozilla XULRunner 1.9.0.5
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/.
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* The J2SE(TM) Java Runtime Environment version 5.0
*
* Copyright 2009 Sun Microsystems, Inc., 4150
* Network Circle, Santa Clara, California 95054, U.S.A. All
* rights reserved. U.S.
* See the LICENSE file in the jre folder for more information.
******************************************************************************/
package edu.cmu.cs.hcii.cogtool.controller;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import edu.cmu.cs.hcii.cogtool.CogTool;
import edu.cmu.cs.hcii.cogtool.CogToolLID;
import edu.cmu.cs.hcii.cogtool.CogToolPref;
import edu.cmu.cs.hcii.cogtool.model.AUndertaking;
import edu.cmu.cs.hcii.cogtool.model.Design;
import edu.cmu.cs.hcii.cogtool.model.ISimilarityDictionary;
import edu.cmu.cs.hcii.cogtool.model.ITermSimilarity;
import edu.cmu.cs.hcii.cogtool.model.Project;
import edu.cmu.cs.hcii.cogtool.model.SNIFACTPredictionAlgo.SNIFACTGroupParameters;
import edu.cmu.cs.hcii.cogtool.model.SimilarityDictionary;
import edu.cmu.cs.hcii.cogtool.model.WidgetAttributes;
import edu.cmu.cs.hcii.cogtool.ui.ProjectContextSelectionState;
import edu.cmu.cs.hcii.cogtool.ui.ProjectInteraction;
import edu.cmu.cs.hcii.cogtool.ui.ProjectUI;
import edu.cmu.cs.hcii.cogtool.uimodel.DictionaryEditorUIModel;
import edu.cmu.cs.hcii.cogtool.util.IUndoableEditSequence;
import edu.cmu.cs.hcii.cogtool.util.ObjectPersister;
import edu.cmu.cs.hcii.cogtool.util.ThreadManager;
import edu.cmu.cs.hcii.cogtool.util.WindowUtil;
public class CommandFile
{
private static class Command {
private final String name;
private final String[] arguments;
private Command(String n, String[] a) {
name = n;
arguments = a;
}
}
protected static abstract class CommandExecutor {
protected abstract void execute(String[] args, CommandFile cf) throws Exception;
}
private static Map<String, CommandExecutor> commandExecutors =
new HashMap<String, CommandExecutor>();
private static void defineExecutor(String name, CommandExecutor ex) {
commandExecutors.put(name, ex);
}
private final List<Command> commands;
private ProjectController currentProject = null;
public CommandFile(String s) {
if (!CogTool.quietCommands) {
System.err.println("Reading and executing commands from " + s);
System.err.println();
}
List<Command> result = new ArrayList<Command>();
LineNumberReader r = null;
try {
r = new LineNumberReader(new FileReader(s));
String line = null;
while ((line = r.readLine()) != null) {
line = line.trim();
if (line.length() == 0 || line.charAt(0) == '#') {
continue;
}
String[] pieces = line.split("\\s*\\$\\s*");
String[] args = new String[pieces.length - 1];
System.arraycopy(pieces, 1, args, 0, args.length);
result.add(new Command(pieces[0], args));
}
} catch (IOException e) {
if (r != null) {
try {
r.close();
} catch (IOException ex) {
// Ignore
}
}
} finally {
CogToolPref.isTracingOverride = null;
}
commands = result;
}
public ProjectController run() {
for (Command cmd : commands) {
if (!CogTool.quietCommands) {
System.err.println(cmd.name);
}
CommandExecutor ex = commandExecutors.get(cmd.name);
if (ex == null) {
System.err.println("Unknown command " + cmd.name);
System.exit(4);
}
try {
// Before each operation, ensure the UI thread has a chance
// to catch up with any pending work.
WindowUtil.interact(true);
if (!CogTool.quietCommands) {
for (String a : cmd.arguments) {
System.err.println(a);
}
System.err.println();
}
ex.execute(cmd.arguments, this);
} catch (Exception e) {
e.printStackTrace();
System.exit(7);
}
}
return currentProject;
}
static {
defineExecutor("open", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
Project proj = (Project)ObjectPersister.ONLY.load(new File(args[0]));
cf.currentProject = ProjectController.openController(proj, false, true);
}});
defineExecutor("import", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
if (cf.currentProject == null) {
cf.currentProject = ProjectController.newProjectController();
}
cf.currentProject.importFile = new File(args[0]);
cf.currentProject.importFileComputes = (args.length > 1 ?
Boolean.parseBoolean(args[1]) :
CogToolPref.COMPSCR.getBoolean());
cf.currentProject.performAction(CogToolLID.ImportXML,
new ProjectContextSelectionState(cf.currentProject.getModel()));
}});
defineExecutor("computeAllSkilled", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
ProjectContextSelectionState seln = new ProjectContextSelectionState(cf.currentProject.getProject());
seln.addSelectedDesigns(cf.currentProject.getProject().getDesigns());
((ProjectUI)cf.currentProject.getUI()).selectAllTasks();
cf.currentProject.recomputeScripts(seln);
((ProjectUI)cf.currentProject.getUI()).deselectAllTasks();
}});
defineExecutor("computeNovice", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
Design design = cf.currentProject.getProject().getDesign(args[0]);
AUndertaking task = cf.currentProject.getProject().getUndertaking(args[1]);
List<String> targets = new ArrayList<String>();
for (int i = 6; i < args.length; ++i) {
targets.add(args[i]);
}
SNIFACTGroupParameters defaults = new SNIFACTGroupParameters(
args[1],
Integer.parseInt(args[2]),
Integer.parseInt(args[3]),
args[4],
targets,
null,
Boolean.parseBoolean(args[5]));
cf.currentProject.computeSnifAct(design, task, null, defaults);
while (true) {
Thread.sleep(1000);
if (!SNIFACTCmd.isComputing) {
break;
}
}
}});
defineExecutor("trace", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
if (args[0].equalsIgnoreCase("yes") || args[0].equalsIgnoreCase("true")) {
CogToolPref.isTracingOverride = Boolean.TRUE;
} else if (args[0].equalsIgnoreCase("no") || args[0].equalsIgnoreCase("false")) {
CogToolPref.isTracingOverride = Boolean.FALSE;
} else {
throw new IllegalArgumentException("Unknown value for trace on the command line: " + args[0]);
}
cf.currentProject.exportFile = args[0];
cf.currentProject.exportResultsToCSV();
}});
defineExecutor("exportResults", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
cf.currentProject.exportFile = args[0];
cf.currentProject.exportResultsToCSV();
}});
defineExecutor("importDictionary", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
Design design = cf.currentProject.getProject().getDesign(args[0]);
ISimilarityDictionary dict = new SimilarityDictionary();
design.setAttribute(WidgetAttributes.DICTIONARY_ATTR, dict);
DictionaryEditorCmd.importDictionary(design, dict, null, null, null, args[1]);
}});
defineExecutor("generateDictionary", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
Design design = cf.currentProject.getProject().getDesign(args[0]);
String algorithm = args[1];
String site = args[2];
String space = args[3];
String url = args[4];
ITermSimilarity data = DictionaryEditorUIModel.computeAlgorithm(algorithm, url, space, site);
GenerateDictEntriesWorkThread workThread =
new GenerateDictEntriesWorkThread(cf.currentProject.getInteraction(),
design,
new AUndertaking[0],
cf.currentProject.getProject(),
(IUndoableEditSequence)null,
new ProjectInteraction.GenerateEntriesData(data, true));
CogTool.logger.info(String.format(
"Generating dictionary for design %s in project %s.",
design.getName(), cf.currentProject.getProject().getName()));
ThreadManager.startNewThread(workThread);
while (!workThread.isFinished()) {
try {
Thread.sleep(2000);
} catch(InterruptedException ex) {
}
}
}});
defineExecutor("saveAs", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
cf.currentProject.saveAsFilename(args[0]);
}});
defineExecutor("quit", new CommandExecutor() {
@Override
protected void execute(String[] args, CommandFile cf) throws Exception {
cf.currentProject.getUI().performAction(CogToolLID.ExitApplication);
}});
}
}