Sunday 4 January 2015

Java 8 Examples dedicated blog

Hi, I have recently started a new blog dedicated to Java 8 examples. I will be covering a lot of topics for Java 8 there. Here is the link: Java 8 Examples

Tuesday 23 December 2014

How to create Interstitial Ad for AdMob in Ionic Cordova app?

You might have encountered an error like, when requesting an ad from AdMob using Cordova AdMob Plugin: interstitialAd is null, call createInterstitialView first

Chances are you are doing it wrong. To create an Interstitial Ad you need to take of three things:

  1. Use interstitialAdId as the key to pass you ad unit id in your options object
  2. First create a Interstitial view using createInterstitialView
  3. In success callback from createInterstitialView use requestInterstitialAd to request an ad

Below is the complete code snippet:

if (window.plugins && window.plugins.AdMob) {
    var admob_key = device.platform == "Android" ? "XXXXX" : "YYYYYYYYY";
    var admob = window.plugins.AdMob;
    var options = {
        interstitialAdId: admob_key,
        autoShow: true
    };
    admob.createInterstitialView(options, function() {
            admob.requestInterstitialAd({
                    'isTesting': false
                },
                function() {
                    admob.showAd(true);
                },
                function(error) {
                    console.log('failed to request ad ' + error);
                }
            );
        },
        function() {
            console.log('failed to create Interstitial view');
        });
} else {
    console.log("Admob plugin not available");
}

Thursday 11 December 2014

Using AmCharts in Play Framework 2 with Java

In this post, I am going to show you how you can use AmCharts in Play Framework 2 using Java.

First create a new Play Framework 2 Java project and download the Javascript libraries for AmCharts. download. After you uncompress the file, you see that there are a lot of files in that folder. You really don't need all of it. To start with, I just chose some of them and put them in the public folder in my Play Framework 2 project:

Make things easier you can also download jQuery.


<script src="@routes.Assets.at("javascripts/jquery-1.11.1.min.js")" type="text/javascript"></script>
<script src="@routes.Assets.at("javascripts/amcharts/amcharts.js")" type="text/javascript"></script>
<script src="@routes.Assets.at("javascripts/amcharts/themes/dark.js")" type="text/javascript"></script>
<script src="@routes.Assets.at("javascripts/amcharts/serial.js")" type="text/javascript"></script>
<script src="@routes.Assets.at("javascripts/amcharts/pie.js")" type="text/javascript"></script>

Now let's create a template file called graph.scala.html and add two empty divs. One for the graph itself and the other for the legend. Also, for the ease of presentation, we put the javascript to handle the graph drawing in this template, but outside the main:

@main("Graphs"){

<div id="test-chart"></div>
<div id="test-legend"></div>

}
<script type="text/javascript">
   // code to handle the graph drawing goes here
</script>


Make sure that the tag ids match. Meaning the first section of the id on both tags should be the same: xxxx-chart, xxxx-legend.
Next, I will talk show you how to draw the actual graph in Javascript. As a rule of thumb, any code related to the AmCharts should be written between:

AmCharts.ready(function(){
   // code goes here
}

Please not that you might see other variations of initialization above across other websites.

Now, let's put the actual code inside the initialization function, for now we use some fake data to show the graph:

      var chart = AmCharts.makeChart("test-chart", {
                    "type": "pie", // type of the graph
                    "theme": "dark", // the theme
                    "legend": { // settings for legend
                         "markerType": "circle",
                         "position": "right",
                         "marginRight": 80,
                         "autoMargins": false
                    },
                    "dataProvider": [{
                         "country": "Czech Republic",
                         "litres": 256.9
                    }, {
                         "country": "Ireland",
                         "litres": 131.1
                    }, {
                         "country": "Germany",
                         "litres": 115.8
                    }, 
                    "valueField": "litres", // field name to get the value from
                    "titleField": "country" // field name to get the title from
                });

Put the route in the 'routes' file, and Implement an action in a controller to show the page:

public class Application extends Controller {

    public static Result showGraph() {
            return ok(graph.render(""));
    }

}

The final and a very important step is to give an initial width size to your div. Create a css file called main.css in public/stylesheets folder and put the following in it:

   #test-chart {
 width  : 100%;
 height  : 500px;
 font-size : 11px;
  }

Make sure you add it to your header in the main.scala.html file:

 <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

Now, run the project and go to the url that you defined in the routes file. You should see something like:

Friday 5 December 2014

Switching between multiple JDKs on Mac OSX

Suppose you are working on a few Java projects and each of which needs a specific version of JDK.

First. make sure that you download your required JDKs: JDK 8 and JDK 7. gm


Second, look for .bash_profile in your home directory ~. If you can't find it, create it as follows:

touch ~/.bash_profile

Next, use a text editor such as vim to open this file as follows:

vim ~/.bash_profile

Now let's add some aliases that will allow us to easily switch between JDKs:

alias setJdk6='export JAVA_HOME=$(/usr/libexec/java_home -v 1.6)'
alias setJdk7='export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)'
alias setJdk8='export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)'

/usr/libexec/java_home is just a command (symlink) that gives you the path for the active JDK, and using -v xx shows the path to the JDK with version xx.


After you added the above aliases to the .bash_profile file, save and close the file and run:

source ~/.bash_profile

This will set the aliases for you. Now to switch between the JDKs, just type setJdkX (replace X with the version number). Example:

setJdk8 

If you would like to know how you can prevent modification of a private field in java, see: Preventing modification of a private field in Java

Thursday 27 November 2014

How to test file upload action in Play Framework 2 in Java?

In this post, we will see how we can test an action that expects a file upload (e.g. a profile picture or an image) in Play Framework 2 for Java. First, lets create an action that accepts a file upload as below:

 public static F.Promise uploadProfileImage() {
    final Http.MultipartFormData body = request().body().asMultipartFormData();
    final Http.MultipartFormData.FilePart picture = body.getFile("picture");
    User user = // get the user from db
    
    final File imgFile = picture.getFile();
    final String imgPathToSave = "images/" + "some unique name";
    //save on disk
    final boolean success = new File("images").mkdirs();
    final byte[] bytes = IOUtils.toByteArray(new FileInputStream(imgFile));
    FileUtils.writeByteArrayToFile(new File(imgPathToSave),bytes);
    user.profileImageUrl = imgPathToSave;
    user.save();
       
}


AS you can see, the body of the request is a MultipartFormData. This makes a bit tricky to write functional tests in Play Framework 2 for Java actually. But, let's see the solution.

@Test
public void uploadProfileImageOK() throws Exception { 
   MultipartFormData.FilePart part = new MultipartFormData.FilePart<>("picture","test-image.jpg",Scala.Option("image/jpeg"),new File("test-image.jpg"));

   MultipartFormData formData = new MultipartFormData(Scala.>emptyMap(),Scala.toSeq(Arrays.asList(part)),Scala.emptySeq(),Scala. emptySeq());

   AnyContent anyContent = new AnyContentAsMultipartFormData(formData);

   Result uploadImageResult = callAction(controllers.routes.ref.UserController.uploadProfileImage(), fakeRequest().withHeader("Csrf-Token", "nocheck").withCookies(fakeCookie).withAnyContent(anyContent,"multipart/form-data", "POST"));

   assertEquals(OK, status(uploadImageResult));

   
}

To see more about functional testing in Play Framework 2 using Java see: How to test an action secure by SecureSocial in Play Framework 2 in Java

How to test an action secure by SecureSocial in Play Framework 2 in Java?

SecureSocial is an authentication module for Play Framework 2 applications supporting OAuth, OAuth2, OpenID, Username/Password and custom authentication schemes. Suppose you have an action and you have secured it with @SecureSocial.SecuredAction annotation:

public class Application extends Controller {
    @SecureSocial.SecuredAction
    public static Result index() {
        Identity user = (Identity) ctx().args.get(SecureSocial.USER_KEY);
        return ok(index.render(user));
    }
}

At the time of writing this blog post, SecureSocial only uses cookies for authentication. If you want to write a functional test for this action without taking care of a fake cookie you will get an unauthorized message. To do this we need to some provisioning before our test. Best is to use the @Befor. Below is the steps:
  1. Lets assume that you save your user authentication data in the User model. Here we create a fake user before
  2. 
    @Before
    public void setUp() throws Exception {
       User user = new User();
       User user = new User();
       user.firstName = "jack";
       user.lastName = "sparrow";
       user.email = "jack.sparrow@caribbean.com";
       user.providerId = "userpasswordid";
       user.password = "$2a$10$ywqls6dRsN4wLr.xNydi2uDVFNkOlmi9WSAfRy.RXdN5sgKKnKhau";
       user.authMethod = "userPassword";
       user.save();
    }
    
    
    Please note that the password that you see above is a hash produced with "Bcrypt" encryption and the value depends on how you have implemented this. See Secure Social Password Plugin for more info.
  3. Now create a class named FunctionalTestHelpers and add the following method:
  4. 
    public static Http.Cookie getFakeCookie(String email){
            User user = User.findByEmail(email);
    
            SocialUser socialUser = new SocialUser(new IdentityId(user.email,user.providerId),
                    user.firstName,
                    user.lastName,
                    String.format("%s %s", user.firstName, user.lastName),
                    Option.apply(user.email),
                    null,
                    new AuthenticationMethod("userPassword"),
                    null,
                    null,
                    Some.apply(new PasswordInfo("bcrypt", user.password, null))
            );
    
            Either either = Authenticator.create(socialUser);
            Authenticator auth = (Authenticator) either.right().get();
            Cookie scalaCookie = auth.toCookie();
    
            return new Http.Cookie(scalaCookie.name(),
                                   scalaCookie.value(),
                                   null,
                                   scalaCookie.path(),
                                   null,
                                   scalaCookie.secure(),
                                   scalaCookie.httpOnly());
    
        }
    
    
  5. Now you can use the code below in your tests to get a fake cookie. The code above basically mimics what SecureSocial does for creating a cookie.
  6.  
    Http.Cookie fakeCookie = FunctionalTestHelpers.getFakeCookie("jack.sparrow@caribbean.com"); 
    
  7. Now lets see it in action:
  8. 
    final Result deleteResult = callAction(controllers.routes.ref.TaskController.removeTask(taskId),fakeRequest().withCookies(fakeCookie).withHeader("Csrf-Token", "nocheck"));
    assertThat(status(deleteResult)).isEqualTo(OK);
    
    

Wednesday 26 November 2014

How to test actions annotated with @RequireCSRFCheck in Play Framework 2?

Let say you have an action as below that you want to protect against CSRF attacks, so you add the @RequireCSRFCheck annotation:

@RequireCSRFCheck
public Result saveUser() {
    // Handle body (process a form)
    return ok();
}

Now suppose you want to write some functional tests for this action. All you need to do is to add fake "nocheck" to your header in "callAction" as below:

final Result result = callAction(controllers.routes.ref.UserController.saveUser(),fakeRequest().withHeader("Csrf-Token", "nocheck"));
assertThat(status(result)).isEqualTo(OK);

For more information about CSRF checks in Play Framework 2 see: JavaCsrf