1 package org.sourceforge.jemm.sample;
2
3 import java.io.File;
4 import java.math.BigDecimal;
5 import java.math.RoundingMode;
6
7 import org.apache.commons.cli.CommandLine;
8 import org.apache.commons.cli.CommandLineParser;
9 import org.apache.commons.cli.GnuParser;
10 import org.apache.commons.cli.HelpFormatter;
11 import org.apache.commons.cli.Options;
12 import org.apache.commons.cli.ParseException;
13 import org.sourceforge.jemm.MemoryStore;
14 import org.sourceforge.jemm.PersistentStore;
15 import org.sourceforge.jemm.RemoteStore;
16 import org.sourceforge.jemm.Session;
17 import org.sourceforge.jemm.Store;
18 import org.sourceforge.jemm.WeaverStatus;
19
20 public abstract class AbstractDemo {
21
22 protected Store store;
23
24 public AbstractDemo(String demoName,boolean requiresWeaving,String args[]) {
25 Options options = new Options();
26 options.addOption("m","mode", true, "The run mode, one of memory,persistent,remote");
27 options.addOption("f","file", true, "The database file location (for use with persistent db)");
28 options.addOption("h","host", true, "The server host (for use with remote db)");
29 options.addOption("p","port", true, "The server port (for use with remote db)");
30 options.addOption("d","debug", false, "Set this flag to enable debug logging");
31
32 try {
33 if(requiresWeaving && !WeaverStatus.isRunning())
34 throw new ParseException("Weaver is require and not enabled (using the -javaagent command "
35 + "line argument), see the documentation for how to do this.");
36
37 CommandLineParser parser = new GnuParser();
38 CommandLine cmd = parser.parse(options, args);
39 if(!cmd.hasOption('m'))
40 throw new ParseException("Mode option must be defined");
41
42 boolean debug = cmd.hasOption('d');
43
44 String mode = cmd.getOptionValue('m').toLowerCase();
45 if(mode.equals("memory"))
46 store = initialiseMemoryDB(debug);
47 else if(mode.equals("persistent"))
48 store = initialisePersistentDB(cmd,debug);
49 else if(mode.equals("remote"))
50 store = initialiseRemoteDB(cmd,debug);
51 else
52 throw new ParseException("mode must be one of ['memory','persistent','remote']");
53
54
55 Session.setStore(store);
56
57 }catch(ParseException pe) {
58 System.out.println("Error initialising demo: " + pe.getMessage());
59 HelpFormatter formatter = new HelpFormatter();
60 formatter.printHelp(demoName, options);
61 System.exit(1);
62 }
63 }
64
65 private Store initialiseRemoteDB(CommandLine cmd,boolean debug) throws ParseException {
66 if(!cmd.hasOption('h'))
67 throw new ParseException("Host option must be defined for remote db");
68
69 if(!cmd.hasOption('p'))
70 throw new ParseException("Port option must be defined for remote db");
71
72 String host = cmd.getOptionValue('h');
73 String portStr = cmd.getOptionValue('p');
74
75 int port = -1;
76 try {
77 port = Integer.parseInt(portStr);
78 } catch(NumberFormatException nfe) {
79 throw new ParseException("Port number is not a valid number");
80 }
81
82 return new RemoteStore(host,port,debug);
83 }
84
85 private Store initialisePersistentDB(CommandLine cmd,boolean debug) throws ParseException {
86 if(!cmd.hasOption('f'))
87 throw new ParseException("For persistent db file option must be defined");
88
89 String dirName = cmd.getOptionValue('f');
90
91 File dbDir = new File(dirName);
92
93 if(dbDir.exists()) {
94 if(!dbDir.isDirectory())
95 throw new ParseException("Target directory (" + dbDir + " is not a directory");
96 } else {
97 if(!dbDir.mkdirs())
98 throw new ParseException("Unable to create directory: " + dbDir);
99 }
100
101 return new PersistentStore(dbDir,debug);
102 }
103
104 private Store initialiseMemoryDB(boolean debug) {
105 return new MemoryStore(debug);
106 }
107
108
109 protected void generateStats(int noUpdates, long timeTaken) {
110 System.out.println("Took " + timeTaken + "ms to perform " + noUpdates + " updates");
111 BigDecimal db = new BigDecimal(timeTaken);
112 BigDecimal bdCount = new BigDecimal(noUpdates);
113
114 BigDecimal perCallTime = db.divide(bdCount);
115
116 BigDecimal callsPerSecond = new BigDecimal(1000).divide(perCallTime,RoundingMode.HALF_UP);
117 System.out.println("Time per call = " + perCallTime + "ms");
118
119 System.out.println("calls per second = " + callsPerSecond);
120 }
121
122
123 }