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