annotate src/samer/core_/util/shell/AppShellBase.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
samer@0 1 /*
samer@0 2 * AppShell.java
samer@0 3 *
samer@0 4 * Copyright (c) 2000, Samer Abdallah, King's College London.
samer@0 5 * All rights reserved.
samer@0 6 *
samer@0 7 * This software is provided AS iS and WITHOUT ANY WARRANTY;
samer@0 8 * without even the implied warranty of MERCHANTABILITY or
samer@0 9 * FITNESS FOR A PARTICULAR PURPOSE.
samer@0 10 */
samer@0 11
samer@0 12 package samer.core.util.shell;
samer@0 13 import samer.core.util.*;
samer@0 14 import samer.core.*;
samer@0 15 import java.io.*;
samer@0 16
samer@0 17 public abstract class AppShellBase extends Properties
samer@0 18 implements Shell.Interface, Agent
samer@0 19 {
samer@0 20 protected AgentManager am;
samer@0 21 protected ViewableManager vm;
samer@0 22 private boolean registerAgents;
samer@0 23 private boolean registerViewables;
samer@0 24
samer@0 25 private static Environment baseEnvironment(String fname)
samer@0 26 {
samer@0 27 try {
samer@0 28 Shell.trace("loading user properties from " +fname);
samer@0 29 FileInputStream in=new FileInputStream(fname);
samer@0 30
samer@0 31 try {
samer@0 32 Properties uprops=new Properties(Shell.env());
samer@0 33 uprops.load(in);
samer@0 34 uprops.setWritable(false);
samer@0 35 Shell.push(uprops);
samer@0 36 Shell.trace("user properties successfully loaded");
samer@0 37 } finally { in.close(); }
samer@0 38 } catch (Exception ex) {
samer@0 39 Shell.trace("failed to load user properties: "+ex);
samer@0 40 }
samer@0 41 return Shell.env();
samer@0 42 }
samer@0 43
samer@0 44 protected static String getDefaultPropertiesFile() {
samer@0 45 return System.getProperty("user.home") + File.separator + "user.props";
samer@0 46 }
samer@0 47
samer@0 48 protected AppShellBase() { this(getDefaultPropertiesFile()); }
samer@0 49 protected AppShellBase(String userPropsFile)
samer@0 50 {
samer@0 51 super(baseEnvironment(userPropsFile));
samer@0 52
samer@0 53 try { execute("load",Shell.env()); }
samer@0 54 catch (Exception ex) { Shell.trace("failed to load local properties"); }
samer@0 55
samer@0 56 Shell.push(this);
samer@0 57 // Shell.push(new FilteredEnvironment(new Properties(this), "bounds"));
samer@0 58 Shell.push(new HashMap(Shell.env()));
samer@0 59
samer@0 60 am = new AgentManager(); registerAgent(am);
samer@0 61 vm = new ViewableManager();
samer@0 62
samer@0 63 registerAgents=true;
samer@0 64 registerViewables=true;
samer@0 65 }
samer@0 66
samer@0 67 public void enableAgentRegistry(boolean f) { registerAgents=f; }
samer@0 68 public void enableViewableRegistry(boolean f) { registerViewables=f; }
samer@0 69
samer@0 70 public void getCommands(Agent.Registry r) {
samer@0 71 // r.add("set").add("get")
samer@0 72 r.add("load").add("save")
samer@0 73 .add("expose").add("exit");
samer@0 74 }
samer@0 75
samer@0 76 public void exit() { am.dispatch("exit",Shell.env()); }
samer@0 77
samer@0 78 public void execute(String cmd, Environment env) throws Exception
samer@0 79 {
samer@0 80 if (cmd.equals("exit")) {
samer@0 81 try { execute("save",this); }
samer@0 82 catch (Exception ex) { Shell.trace(ex.toString()); }
samer@0 83
samer@0 84 // not any more. Just exit and be done.
samer@0 85 // am.exitOnReturn(); // must let other agents respond before System.exit
samer@0 86 System.exit(0);
samer@0 87
samer@0 88 } else if (cmd.equals("expose")) {
samer@0 89 if (!vm.hasViewerContainer()) {
samer@0 90 vm.exposeViewables(getViewerContainer());
samer@0 91 }
samer@0 92
samer@0 93 } else if (cmd.equals("get")) { // get property
samer@0 94 String nm = X.string(env.datum());
samer@0 95 Shell.print("name: "+nm);
samer@0 96 try {
samer@0 97 Object val=X.object(datum(nm));
samer@0 98 Shell.print("value: "+val);
samer@0 99 env.add(val);
samer@0 100 } catch (Exception ex) { Shell.print("value: ** not bound **"); }
samer@0 101
samer@0 102 } else if (cmd.equals("set")) {
samer@0 103 X.store(X.string(env.datum()),X.object(env.datum()));
samer@0 104
samer@0 105 } else if (cmd.equals("load")) {
samer@0 106 String fname=X.string(env.datum("local.props"),"args");
samer@0 107 Shell.trace("loading properties from "+fname);
samer@0 108 InputStream in=new FileInputStream(fname);
samer@0 109 try { props.load(in); }
samer@0 110 finally { in.close(); }
samer@0 111
samer@0 112 } else if (cmd.equals("save")) {
samer@0 113 String fname=X.string(env.datum("local.props"),"args");
samer@0 114 Shell.trace("saving properties to "+fname);
samer@0 115
samer@0 116 try {
samer@0 117 File file=new File(fname);
samer@0 118 File old=new File(fname+".old");
samer@0 119 try { old.delete(); }
samer@0 120 catch (Exception ex) {}
samer@0 121 file.renameTo(old);
samer@0 122 } catch (Exception ex) {
samer@0 123 Shell.trace(ex.toString());
samer@0 124 }
samer@0 125
samer@0 126 OutputStream out=new FileOutputStream(fname);
samer@0 127 try { props.store(out,"properties"); }
samer@0 128 finally { out.close(); }
samer@0 129 }
samer@0 130 }
samer@0 131
samer@0 132 protected void put(Class a, Class b) { samer.core.Registry.put(a,b); }
samer@0 133
samer@0 134 public void trace(String msg) { System.err.println(msg); }
samer@0 135 // public void trace(String string) {
samer@0 136 // System.err.println(" "+(System.currentTimeMillis() % 8192L)+": "+string);
samer@0 137 // }
samer@0 138 public void registerAgent(Agent a) { if (registerAgents) am.registerAgent(a); }
samer@0 139 public void deregisterAgent(Agent a) { am.deregisterAgent(a); }
samer@0 140 public void deregisterViewable(Viewable v) { vm.deregisterViewable(v); }
samer@0 141 public void registerViewable(Viewable v) { if (registerViewables) vm.registerViewable(v); }
samer@0 142
samer@0 143 protected abstract ViewableManager.ViewerContainer getViewerContainer();
samer@0 144 }
samer@0 145