Friday, May 18, 2018

Testing A Java Bean For Code Coverage in SonarQube



Here is a generic way of testing a java bean to provide 100% code coverage on sonarqube.

Remember, if beans are trivial, please use this approach, otherwise write proper test cases.


Complete Source code is here -
https://gist.github.com/deodeveloper/405bfbaf8ad94a37304dbfe8949f5757



Sample Source code -


import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.PropertyUtils;

public class BeanTester {

public static <T>  void testBean(Class<T>... beanClasses) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {
    for (Class<T> beanClass : beanClasses) {
      T bean = beanClass.newInstance();
      Field[] declaredFields = beanClass.getDeclaredFields();
      for (Field f : declaredFields) {
        PropertyUtils.getProperty(bean, f.getName());
        Class<?> fieldType = f.getType();
        PropertyUtils.setProperty(bean, f.getName(),
            !fieldType.isPrimitive() ? fieldType.newInstance() :
                defaultValue(fieldType));
      }
    }
  }

  public static <T> T defaultValue(Class<T> type) {
    if (type == boolean.class) {
      return (T) Boolean.FALSE;
    } else if (type == char.class) {
      return (T) Character.valueOf('\0');
    } else if (type == byte.class) {
      return (T) Byte.valueOf((byte) 0);
    } else if (type == short.class) {
      return (T) Short.valueOf((short) 0);
    } else if (type == int.class) {
      return (T) Integer.valueOf(0);
    } else if (type == long.class) {
      return (T) Long.valueOf(0L);
    } else if (type == float.class) {
      return (T) Float.valueOf(0f);
    } else if (type == double.class) {
      return (T) Double.valueOf(0d);
    } else {
      return null;
    }
  }

}

usage example - testBean(Person.class)
dependencies used:
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>




Sunday, March 11, 2018

Vertx Programming Style : Your Reactive Web Companion REST API Explained


Vertx provides a lot of options to program in a light weight environment, like node.js . However, It could be little confusing for new users to choose which method to adopt for creating REST API.

There are different models to adopt while programming in vertx. They are explained below with easy to understand diagrams.

P.S - The heart of vertx programming is a reference to vertx object which could be obtained statically or as an inherited member with a verticle that extends the AbstractVerticle class. Now you know where to get the vertx object. Let's dive further.

Different Models of programming in vertx falls into the following categories as below, I am adding some funny names to each model :) :-

  1. FaceToFace Approach
  2. Matchmaker Approach
  3. Matching Coach Approach


Model 1 - FaceToFace Approach:

As shown in the diagram, in this model client sends the events in forms of http requests which are buffered to server verticle via a Router. A router could be obtained by using Router.router(vertx)

Now we can configure the router to handle http requests. Careful, router handlers are synchronous call. To run blocking calls or any async operations, please use executeBlocking or adopt Model#2

Model #2 - Matchmaker Approach:
As the name suggests, you can't talk to the other person directly, you will have to go through the dating match maker which is the event bus. This is model is useful when you have a lot of micro services running on different machines or you want to modularize your code in a single machine. A message has header, body, address and by calling message.reply(Object), the receiver verticle can send response back to the sender.





Model 3: Matching Coach Approach:

Here The matchmaker becomes a coach too who will help you how to connect other verticle. It helps by code generation to bind service with event bus so that it would be easier to call service methods.

The main idea is a service name Service (java interface) and corresponding implementation Service Implementation to be exposed as a REST API. But it can't be that straight forward in vertx as in spring web or other frameworks. For Service interface to be exposed, you need to create a AsyncService interface and it's implementation which will mimic Service methods but the signatures will be little different.

Example: In Service interface, you have a method as below:
public User getUser(final String verificationToken) {...}

In async service interface, the same looks like, 
void getUser(String verificationToken, Handler<AsyncResult<User>> resultHandler)

Here we adding an extra argument to the method in form of a vertx Handler that returns an AsyncResult which makes it possible for non-blocking call. Also the return type is void. The result could obtained from the client side using the resultHandler callback.



Please leave your comments below.

Happy Coding!

Thursday, October 19, 2017

URLify in java 8 style functional flavor


 Write a method to replace all spaces in a string with '%20'


Instead of using str.replaceAll("\\s", "%20"), here is a function. This exercise is to help learning.



public String URLifyJava8(String str) {
return str.chars()
.mapToObj(c -> (char) c)
.flatMap(c -> Character.isWhitespace(c)
? "%20".chars().mapToObj(ch -> (char) ch) : Stream.of(c))
.collect(Collector
.of(StringBuilder::new, StringBuilder::append,
(r1, r2) -> {
r1.append(r2);
return r1;
},
StringBuilder::toString, Collector.Characteristics.CONCURRENT));
}

Thursday, June 6, 2013

JQuery XML find method problem - Webkit and chrome fix




If you have xml element tag like this <gml:featureMember>, then jQuery(xml).find("gml\\:featureMember").each(function(){}); will not work across all the browsers, it works in IE and firefox.


To fix it, use as below

$(xml).find("gml\\:featureMember,featureMember").each(function() {
// Do stuff
});
 
 

This works across all the browser.
 

Friday, January 25, 2013

Accept Self signed certificate in JAVA


Accept Self signed certificate in JAVA.

Have you ever faced problem with SSLHandshakeException ?

This is because you are trying to use a website which uses an non-standard https certificate which are not registered on JRE. If you want a self signed certificate web request to be accepted, here is the code.


import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class SSLTest {

    public static void main(String [] args) throws Exception {
        // configure the SSLContext with a TrustManager
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        URL url = new URL("https://mms.nw.ru");
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        });
        System.out.println(conn.getResponseCode());
        conn.disconnect();
    }

    private static class DefaultTrustManager implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
}

Friday, January 4, 2013

Convert EPGS to WGS84 using open layer


This is useful when you want to convert your EPSG to google or bing map co-ordinate.


var projWGS84 = new OpenLayers.Projection("EPSG:4326");

var proj900913 = new OpenLayers.Projection("EPSG:102711");

var orinialPoint =  new OpenLayers.LonLat(609638.467487335, 691427.100266891);

 var newPoint = orinialPoint.transform(proj900913, projWGS84);


var projWGS84 = new OpenLayers.Projection("EPSG:4326");

var proj900913 = new OpenLayers.Projection("EPSG:102711");

var orinialPoint =  new OpenLayers.LonLat(609638.467487335, 691427.100266891);

 var newPoint = orinialPoint.transform(proj900913, projWGS84);
var projWGS84 = new OpenLayers.Projection("EPSG:4326");

var proj900913 = new OpenLayers.Projection("EPSG:102711");

var orinialPoint =  new OpenLayers.LonLat(609638.467487335, 691427.100266891);

 var newPoint = orinialPoint.transform(proj900913, projWGS84);

var projWGS84 = new OpenLayers.Projection("EPSG:4326");

var proj900913 = new OpenLayers.Projection("EPSG:102711");

var orinialPoint =  new OpenLayers.LonLat(609638.467487335, 691427.100266891);

 var newPoint = orinialPoint.transform(proj900913, projWGS84);

var projWGS84 = new OpenLayers.Projection("EPSG:4326");

var proj900913 = new OpenLayers.Projection("EPSG:102711");

var orinialPoint =  new OpenLayers.LonLat(609638.467487335, 691427.100266891);

 var newPoint = orinialPoint.transform(proj900913, projWGS84);

Now you can use this newPoint on your preferred map.