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();
+}
+