Tuesday, January 8, 2013
Updated SSH Deployment module for Play 1.2.x
Friday, December 28, 2012
Using custom models in routes in Play framework Java 2.x, aka PathBindable.
If you want to reduce clutter in your controllers you can use PathBindables to automatically convert URL parameters to your model objects or other custom objects. For example you can get rid of the code that takes an id, looks up the user in a database and checks for null etc by wrapping into a custom PathBindable implementation. This will also make it easier to reuse code among your controllers.
You will need to do 3 things to get this to work,
1. Create a controller and action, such aspublic static userName(User user) { return ok(user.getName()); }
Note that user is always non null and is safe to use. An exception is thrown internally if the lookup fails and Play will return a bad request response to the client.
2. Create a route, such asGET /user/:user MyController.userName(user : models.User)
Here we create an actual callable URL, for example, /user/124. In this example we use the id in the route but it can be anything that you can map to your model, for example unique email addresses.
3. Implement the PathBindable interfaceYou can add the PathBindable code to your existing model,
package models; import javax.persistence.Entity; import javax.persistence.Id; import play.Logger; import play.db.ebean.Model; import play.db.ebean.Model.Finder; import play.mvc.PathBindable; @Entity public class User extends Model implements PathBindableReferences, https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/java/play/mvc/PathBindable.java http://julien.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-pathbindable-with-play-2/{ @Id Long id; String name; public String getName() { return name; } @Override public User bind(String key, String id) { // key is "user" // id is the ":user" part of the route, i.e. 1 if you have /user/1 User user = find.byId(new Long(id)); if (user == null) throw new IllegalArgumentException("User not found"); return user; } @Override public String javascriptUnbind() { return null; } @Override public String unbind(String arg0) { return name; } public static Finder find = new Finder (Long.class, User.class); }
Friday, November 16, 2012
Dojo strikes back
// rant over...
Sunday, November 11, 2012
SSH Deployment module for Play 1.2.x released!
Here is some of the copy pasted docs I wrote (for full docs, go here),
What it does
Easily deploy your application to Linux boxes using SSH and Rsync. You can deploy the same application to multiple machines, for example pushing to a test environment or multiple production backend nodes.
Usage
Push changes to server
play deploy:update
Start, stop & restart your play application
play deploy:start
play deploy:stop
play deploy:restart
The module supports command line arguments for overriding any of the parameters, you can also specify which instance to use (deploy.INSTANCE_NAME.host=10.0.0.1 etc). For full docs see, https://github.com/nylund/play-deploy/blob/master/documentation/manual/home.textile
Setup
Add this to your application.conf:
deploy.default.host=IP_or_hostname
deploy.default.login=remote_user_name
deploy.default.port=remote_port
deploy.default.path=remote_directory, for example /home/user/app-deploy/test1
deploy.default.play_path=remote_path_to_play_binary, for example /home/user/app-deploy/play-1.2.5/play
Add this to your dependencies.yml:
require:
- play
- deploy -> deploy 0.1
repositories:
- deploy:
type: http
artifact: http://albin.abo.fi/~ninylund/play_modules/deploy-0.1.zip
contains:
- deploy -> *
Get the module, http://www.playmodules.net/module/34
Check the code at Github, https://github.com/nylund/play-deploy
Sunday, November 14, 2010
Simple Boost Spirit example.
Download the full source code
The parser accepts the following input:
new order
*(buy|sell amount stock_name price)
end order
Here are a few examples:
new order
buy 10 ABC 2.50
sell 20 QWE 5.00
end order
new order
buy 10 ABC 2.50
buy 10 ABC 2.50
buy 10 ABC 2.50
sell 20 QWE 5.00
end order
As you can see the input the parser accepts is really simple and I could have probably saved lots of time by writing the parser manually without using any framework. If you download and look at the source code you see it's fairly easy to extend the parser to take much more complicated input.
Wednesday, May 26, 2010
JUnit reporter for Unitest++
This is how you normally use Unittest++'s built-in XML reporter:
std::ofstream f("test-report.xml");Simply replace it with the following,
UnitTest::XmlTestReporter reporter(f);
UnitTest::TestRunner runner(reporter);
return runner.RunTestsIf(UnitTest::Test::GetTestList(), NULL, UnitTest::True(), 0);
std::string f = "TESTS-";Note that the JUnit reporter does not take a complete filename because the JUnit format requires that different test suites are split into different files. The output files are named TESTS-suitename.xml.
UnitTest::JUnitXmlTestReporter reporter(f);
UnitTest::TestRunner runner(reporter);
return runner.RunTestsIf(UnitTest::Test::GetTestList(), NULL, UnitTest::True(), 0);
Download
JUnitXMLTestReporter.h
JUnitXMLTestReporter.cpp