View Javadoc

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  			// sets the active store
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 }