Mercurial > hg > jslab
diff src/samer/core_/util/shell/AppShellBase.java @ 0:bf79fb79ee13
Initial Mercurial check in.
author | samer |
---|---|
date | Tue, 17 Jan 2012 17:50:20 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/samer/core_/util/shell/AppShellBase.java Tue Jan 17 17:50:20 2012 +0000 @@ -0,0 +1,145 @@ +/* + * AppShell.java + * + * Copyright (c) 2000, Samer Abdallah, King's College London. + * All rights reserved. + * + * This software is provided AS iS and WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +package samer.core.util.shell; +import samer.core.util.*; +import samer.core.*; +import java.io.*; + +public abstract class AppShellBase extends Properties + implements Shell.Interface, Agent +{ + protected AgentManager am; + protected ViewableManager vm; + private boolean registerAgents; + private boolean registerViewables; + + private static Environment baseEnvironment(String fname) + { + try { + Shell.trace("loading user properties from " +fname); + FileInputStream in=new FileInputStream(fname); + + try { + Properties uprops=new Properties(Shell.env()); + uprops.load(in); + uprops.setWritable(false); + Shell.push(uprops); + Shell.trace("user properties successfully loaded"); + } finally { in.close(); } + } catch (Exception ex) { + Shell.trace("failed to load user properties: "+ex); + } + return Shell.env(); + } + + protected static String getDefaultPropertiesFile() { + return System.getProperty("user.home") + File.separator + "user.props"; + } + + protected AppShellBase() { this(getDefaultPropertiesFile()); } + protected AppShellBase(String userPropsFile) + { + super(baseEnvironment(userPropsFile)); + + try { execute("load",Shell.env()); } + catch (Exception ex) { Shell.trace("failed to load local properties"); } + + Shell.push(this); +// Shell.push(new FilteredEnvironment(new Properties(this), "bounds")); + Shell.push(new HashMap(Shell.env())); + + am = new AgentManager(); registerAgent(am); + vm = new ViewableManager(); + + registerAgents=true; + registerViewables=true; + } + + public void enableAgentRegistry(boolean f) { registerAgents=f; } + public void enableViewableRegistry(boolean f) { registerViewables=f; } + + public void getCommands(Agent.Registry r) { + // r.add("set").add("get") + r.add("load").add("save") + .add("expose").add("exit"); + } + + public void exit() { am.dispatch("exit",Shell.env()); } + + public void execute(String cmd, Environment env) throws Exception + { + if (cmd.equals("exit")) { + try { execute("save",this); } + catch (Exception ex) { Shell.trace(ex.toString()); } + + // not any more. Just exit and be done. + // am.exitOnReturn(); // must let other agents respond before System.exit + System.exit(0); + + } else if (cmd.equals("expose")) { + if (!vm.hasViewerContainer()) { + vm.exposeViewables(getViewerContainer()); + } + + } else if (cmd.equals("get")) { // get property + String nm = X.string(env.datum()); + Shell.print("name: "+nm); + try { + Object val=X.object(datum(nm)); + Shell.print("value: "+val); + env.add(val); + } catch (Exception ex) { Shell.print("value: ** not bound **"); } + + } else if (cmd.equals("set")) { + X.store(X.string(env.datum()),X.object(env.datum())); + + } else if (cmd.equals("load")) { + String fname=X.string(env.datum("local.props"),"args"); + Shell.trace("loading properties from "+fname); + InputStream in=new FileInputStream(fname); + try { props.load(in); } + finally { in.close(); } + + } else if (cmd.equals("save")) { + String fname=X.string(env.datum("local.props"),"args"); + Shell.trace("saving properties to "+fname); + + try { + File file=new File(fname); + File old=new File(fname+".old"); + try { old.delete(); } + catch (Exception ex) {} + file.renameTo(old); + } catch (Exception ex) { + Shell.trace(ex.toString()); + } + + OutputStream out=new FileOutputStream(fname); + try { props.store(out,"properties"); } + finally { out.close(); } + } + } + + protected void put(Class a, Class b) { samer.core.Registry.put(a,b); } + + public void trace(String msg) { System.err.println(msg); } +// public void trace(String string) { +// System.err.println(" "+(System.currentTimeMillis() % 8192L)+": "+string); +// } + public void registerAgent(Agent a) { if (registerAgents) am.registerAgent(a); } + public void deregisterAgent(Agent a) { am.deregisterAgent(a); } + public void deregisterViewable(Viewable v) { vm.deregisterViewable(v); } + public void registerViewable(Viewable v) { if (registerViewables) vm.registerViewable(v); } + + protected abstract ViewableManager.ViewerContainer getViewerContainer(); +} +