java
Compile java code at runtime
I have a java class that is used to perform login action using selenium. There are currently 10+ different login types and as such there is a lot of if else involved which looks bad and is not efficient. Eg: if (logintype == 1 ) { driver.findElement(By.id("username")).clear(); driver.findElement(By.id("username")).sendKeys(username); driver.findElement(By.id("password")).clear(); driver.findElement(By.id("password")).sendKeys(password); driver.findElement(By.id("signin")).click(); } else if (logintype ==2 ) { driver.findElement(By.id("username")).clear(); driver.findElement(By.id("username")).sendKeys(username); driver.findElement(By.id("password")).clear(); driver.findElement(By.id("password")).sendKeys(password); driver.findElement(By.id("signin")).click(); } ........... ........... Other than code not being efficient the new code needs to be written, pushed and the server needs to be restarted every time a new login module is added. I wanted to see if i can get the logic for login can be stored in db and if it can be compiled at runtime. I found groovy shell but i dont know how to get the results back to my class file. Also running groovy shell would require a lot of code changes. Is it possible in java public class ExecuteAuth implements Runnable{ private WebDriver driver; driver = new FirefoxDriver(firefoxBinary, profile, cap); driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); driver.manage().window().maximize(); //MongoDB code DBCursor dbObjects = loginCollection.find(); while (dbObjects.hasNext()) { DBObject dbObject = dbObjects.next(); loginModule.add(new LoginModule((BasicDBObject) dbObject)); String loginType = (String) dbObject.get("loginType") String script; if (loginType.equals("1")) { script = (String) dbObject.get("script") } } GroovyShell shell = new GroovyShell (); shell.evaluate(script); RUN REST OF THE LOGIN LOGIC AFTER THE CODE IS EVALUATED }
I strongly advise against that approach. You are opening a door to bad code be injected in your application. Another way could be upload to your server your new jars and take advantage of class loader to load classes at runtime: How should I load Jars dynamically at runtime? Also, you have alternatives to avoid if-else's: usage of interfaces and factory methods are the way to go, imho. And put your login's implementations on different classes implementing a Login interface, for example. Factory method design pattern: http://www.oodesign.com/factory-method-pattern.html http://www.javaworld.com/article/2077386/learn-java/factory-methods.html
Related Links
Stop H2 database programmatically
MapApp error for java
Java Line2D always starts from top left of JFrame
How to convert string to json using net.sf.json (json-taglib-2.2.2)
listview with HashMap show only one data
NPException in ArrayList? Java
how to retrieve the values from a list of hashes in java
How to find Max, Min, and Average of Array java
Getting Blank page While using JSP with Google App Engine
Java Threads and Timing: Nedd opinions on implementation
When making a selection from the spinner, app force closes
In Java, can thread switching happen in the synchronized block?
Can a simple program that runs in the java IDE client console be an executable file?
Find words with most occurrence of each letter in the alphabet
Generic class constructor failing with a class cast exception error at runtime
Injection of autowired dependencies failed; No matching bean