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
|