1
2
3
4
5
6
7
8
9
10 package nl.tudelft.simulation.dsol.gui;
11
12 import java.io.File;
13 import java.io.FileInputStream;
14 import java.io.FileOutputStream;
15 import java.io.IOException;
16 import java.net.URL;
17 import java.util.Arrays;
18 import java.util.Comparator;
19 import java.util.Iterator;
20 import java.util.Properties;
21 import java.util.TreeSet;
22
23 import nl.tudelft.simulation.dsol.experiment.Experiment;
24 import nl.tudelft.simulation.dsol.gui.applets.DSOLSecurityManager;
25 import nl.tudelft.simulation.dsol.gui.windows.DSOLFrame;
26 import nl.tudelft.simulation.dsol.simulators.Animator;
27 import nl.tudelft.simulation.event.EventProducer;
28 import nl.tudelft.simulation.language.io.URLResource;
29 import nl.tudelft.simulation.logger.Logger;
30 import nl.tudelft.simulation.logger.handlers.MemoryHandler;
31
32 /***
33 * The DSOL Application <br>
34 * (c) copyright 2002-2005 <a href="http://www.simulation.tudelft.nl">Delft
35 * University of Technology </a>, the Netherlands. <br>
36 * See for project information <a
37 * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a> <br>
38 * License of use: <a href="http://www.gnu.org/copyleft/lesser.html">Lesser
39 * General Public License (LGPL) </a>, no warranty.
40 *
41 * @version $Revision$ $Date$
42 * @author <a href="http://www.tbm.tudelft.nl/webstaf/peterja">Peter Jacobs </a>
43 */
44 public class DSOLApplication extends EventProducer implements
45 DSOLApplicationInterface
46 {
47 /*** the experiment */
48 protected Experiment experiment = null;
49
50 /*** the properties */
51 protected Properties properties = new Properties();
52
53 /*** the recents */
54 protected TreeSet recents = new TreeSet(new RecentComparator());
55
56 /***
57 * constructs a new DSOLApplicationInterface
58 *
59 * @param navigation an URL to an xml-based navigation structure.
60 */
61 public DSOLApplication(final URL navigation)
62 {
63 super();
64 System.setSecurityManager(new DSOLSecurityManager());
65
66 Logger.setDefaultHandler(MemoryHandler.class);
67 try
68 {
69 this.readProperties(this.properties);
70 new DSOLFrame(this, navigation);
71 } catch (Exception exception)
72 {
73 Logger.warning(this, "DSOLApplicationInterface", exception);
74 }
75 }
76
77 /***
78 * @see java.lang.Object#finalize()
79 */
80 protected void finalize() throws Throwable
81 {
82 this.writeProperties(this.properties);
83 super.finalize();
84 }
85
86 /***
87 * returns the experiment
88 *
89 * @return Experiment
90 */
91 public Experiment getExperiment()
92 {
93 return this.experiment;
94 }
95
96 /***
97 * sets the experiment
98 *
99 * @param experiment the experiment
100 */
101 public void setExperiment(final Experiment experiment)
102 {
103 this.experiment = experiment;
104 if (this.experiment != null && this.experiment.getUrl() != null)
105 {
106 this.recents.add(new Recent(experiment.getUrl().toString(), System
107 .currentTimeMillis()));
108 Object[] elements = this.recents.toArray();
109 this.recents.clear();
110 this.recents.addAll(Arrays.asList(elements));
111 try
112 {
113 this.writeProperties(this.properties);
114
115 this.experiment.setSimulator(new Animator());
116 this.experiment.start();
117 this.experiment.getSimulator().stop();
118 } catch (Exception exception)
119 {
120 Logger.warning(this, "setExperiment", exception);
121 }
122 }
123 this.fireEvent(EXPERIMENT_CHANGED_EVENT, experiment);
124 }
125
126 /***
127 * returns the properties
128 *
129 * @return Properties
130 */
131 public Properties getProperties()
132 {
133 return this.properties;
134 }
135
136 /***
137 * executes the dsol control panel
138 *
139 * @param args the command-line arguments
140 */
141 public static void main(final String[] args)
142 {
143 URL navigation = null;
144 if (args.length != 0)
145 {
146 navigation = URLResource.getResource(args[0]);
147 } else if (System.getProperty("dsol.navigation") != null)
148 {
149 navigation = URLResource.getResource(System
150 .getProperty("dsol.navigation"));
151 }
152 if (navigation == null)
153 {
154 navigation = URLResource.getResource("/navigation.xml");
155 }
156 new DSOLApplication(navigation);
157 }
158
159 /***
160 * reads the properties
161 *
162 * @param properties the properties to read
163 * @throws IOException on failure
164 */
165 private void readProperties(final Properties properties) throws IOException
166 {
167 properties.load(URLResource.getResourceAsStream("/dsol.properties"));
168 String tempPath = System.getProperty("java.io.tmpdir");
169 String fileName = this.getClass().getName() + "_dsol.properties";
170 File file = new File(tempPath, fileName);
171 if (file.exists() && !("true".equals(properties.get("edited"))))
172 {
173 FileInputStream stream = new FileInputStream(file);
174 properties.load(stream);
175 stream.close();
176 }
177 int i = 0;
178 String value = null;
179 while ((value = properties.getProperty("recent[" + i + "]")) != null)
180 {
181 String[] elements = value.split("!#!");
182 this.recents.add(new Recent(elements[0], Long
183 .parseLong(elements[1])));
184 i++;
185 }
186 }
187
188 /***
189 * reads the properties
190 *
191 * @param properties the properties to read
192 * @throws IOException on failure
193 */
194 private void writeProperties(final Properties properties)
195 throws IOException
196 {
197 int loop = 0;
198 for (Iterator i = this.recents.iterator(); i.hasNext();)
199 {
200 Recent recent = (Recent) i.next();
201 if (loop <= 5)
202 {
203 this.properties.put("recent[" + loop + "]", recent.getLabel()
204 + "!#!" + recent.getExecutionTime());
205 }
206 loop++;
207 }
208 String tempPath = System.getProperty("java.io.tmpdir");
209 String fileName = this.getClass().getName() + "_dsol.properties";
210 File file = new File(tempPath, fileName);
211 if (!file.exists())
212 {
213 file.createNewFile();
214 }
215 FileOutputStream outputStream = new FileOutputStream(file);
216 this.properties.store(outputStream, "");
217 outputStream.close();
218 }
219
220 /***
221 * the Recent Comparator
222 */
223 private static class RecentComparator implements Comparator
224 {
225 /***
226 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
227 */
228 public int compare(final Object o1, final Object o2)
229 {
230 Recent r1 = (Recent) o1;
231 Recent r2 = (Recent) o2;
232 if (r1.getLabel().equals(r2.getLabel()))
233 {
234 long executionTime = Math.max(r1.getExecutionTime(), r2
235 .getExecutionTime());
236 r1.executionTime = executionTime;
237 r2.executionTime = executionTime;
238 return 0;
239 }
240 return new Long(r2.getExecutionTime()).compareTo(new Long(r1
241 .getExecutionTime()));
242 }
243 }
244
245 /***
246 * A RecentItem
247 */
248 private static class Recent
249 {
250 /*** the label to use */
251 private String label = null;
252
253 /*** the executionTime */
254 protected long executionTime = 0L;
255
256 /***
257 * constructs a new Recent
258 *
259 * @param label the label of the experimen
260 * @param executionTime the executionTime of the experiment
261 */
262 public Recent(final String label, final long executionTime)
263 {
264 this.executionTime = executionTime;
265 this.label = label;
266 }
267
268 /***
269 * @return Returns the executionTime.
270 */
271 public long getExecutionTime()
272 {
273 return this.executionTime;
274 }
275
276 /***
277 * @return Returns the label.
278 */
279 public String getLabel()
280 {
281 return this.label;
282 }
283 }
284 }