Asdfasf

Thursday, February 28, 2013

Creating Dynamic HTML form with JQuery

In following sample, we will generate form elements dynamically according to provided html snippet in text area. I do nothing, jquery does all job :), thanks to it.
When user enters html form elements in text area and submit "Add html code entered in text are to form" button, form elements will be generated dynamically.


When user clicks on "Submit" button, form elements will be sent with GET method to google :) :
https://www.google.com/?education=HighSchool&TofD=Day

Here is html code, you have to download jquery and put it next to this html file.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Demo</title>
</head>

<body>
<script src="jquery-1.9.1.js"></script>
 <script>
$( document ).ready(function() {
 $("#add").click(function( event ){
  $("#formdiv").html("");

  htmlcode = document.getElementById("htmlcode").value;

  $("#formdiv").html(htmlcode);
 });
});


</script>

<textarea rows="4" cols="50" id="htmlcode"></textarea>
<br/>
<input name="add" type="button" value="Add html code entered in text area to form" id="add"/>

<br/>
SUBMISSION FORM:
<table border=1>
<tr><td>

<form method="get" action="http://www.google.com">
<div name="formdiv" id ="formdiv"></div>
<input type="submit" value="Submit"/>
</form>

</td></tr>
</table>
</body>
</html>

Dynamic Java Code Execution at Runtime with BeanShell

BeanShell provides to execute code snippets at runtime without compiling and restarting JVM. This functionality enables us to execute custom operations at runtime. Lets consider following case: Admin user of our system wants to manipulate a system value at runtime and enters a configuration for that purpose. Lets say, parameter, which manipulation will be executed on, holds a string tokenized with pipe character and we wants to change its value by finding max part of tokenized values.

Here is how that operation can be implemented with pure java


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.ferhat.beanshell.work;

import java.util.StringTokenizer;

public class ValueManipulatorByJava {
 public static String getMax(String input) {
  StringTokenizer tok = new StringTokenizer(input, "|");
  int max = 0;
  while (tok.hasMoreElements()) {
   int intval = Integer.parseInt((String) tok.nextElement());
   if (intval > max) {
    max = intval;
   }
  }
  return String.valueOf(max);
 }

 public static void main(String[] args){
  long start = System.currentTimeMillis();
  System.out.println("Result is :" + getMax("9|3|10|11|1|8"));
  
  System.out.println("Java evaluation took " + (System.currentTimeMillis() - start) + " msec");
 }
}

Now lets see if this operation shall be done at runtime with provided code snippet:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.ferhat.beanshell.work;

import bsh.EvalError;
import bsh.Interpreter;

public class ValueManipulatorByBeanShell {
 
 public static String getMax(String input, String script) throws EvalError {
  Interpreter i = new Interpreter();
  i.set("input", input);

  Object output = i.eval(script);

  return (String) output;
 }

 public static void main(String[] args) throws EvalError {
  
  String script = "StringTokenizer tok = new StringTokenizer(input, \"|\");\n" + 
    "  int max = 0;\n" + 
    "  while (tok.hasMoreElements()) {\n" + 
    "   int intval = Integer.parseInt((String) tok.nextElement());\n" + 
    "   if (intval > max) {\n" + 
    "    max = intval;\n" + 
    "   }\n" + 
    "  }\n" + 
    "  return String.valueOf(max);\n" +  
    "";
  
  String input = "9|3|10|11|1|8";

  long start = System.currentTimeMillis();
  String output = getMax(input, script);
  System.out.println("Result is: " + output);
  System.out.println("BeanShell evaluation took " + (System.currentTimeMillis() - start) + " msec");
  
  start = System.currentTimeMillis();
  output = getMax(input, script);
  System.out.println("Result is: " + output);
  System.out.println("BeanShell evaluation took " + (System.currentTimeMillis() - start) + " msec");
  
  start = System.currentTimeMillis();
  output = getMax(input, script);
  System.out.println("Result is: " + output);
  System.out.println("BeanShell evaluation took " + (System.currentTimeMillis() - start) + " msec");
 }
}
As easy as much above. Here is output:


1
2
3
4
5
6
Result is: 11
BeanShell evaluation took 69 msec
Result is: 11
BeanShell evaluation took 8 msec
Result is: 11
BeanShell evaluation took 8 msec

Finally, i must say that altough first execution takes some time, succeeding executions takes faily short time. BeanShell provides us significant flexibility over processes at runtime.

Saturday, February 16, 2013

Dependency Inversion Principle (DIP)

This principle is D of S.O.L.I.D design principles.According to Dependency Inversion Principle,

  • High-level modules should not depend on low-level modules. Both should depend on abstractions.
  • Abstractions should not depend upon details. Details should depend upon abstractions. (See Reference)

Here is some more explanation on DIP with a good example.

Interface Segregation principle (ISP)

This principle is I of S.O.L.I.D design principles.

Interface Segregation Principle stats that a client should not implement an interface if it doesn’t use that. this happens mostly when one interface contains more than one functionality and client only need one functionality and not other.Interface design is tricky job because once you release your interface you can not change it without breaking all implementation. Another benefit of this desing principle in Java is, interface has disadvantage to implement all method before any class can use it so having single functionality means less method to implement.

Here is an easy to understand ISP example

Open Closed Principle (OCP)

This principle is O of S.O.L.I.D design principles.

According to Open Closed Principle, Software entities (Classes, modules, functions) should be OPEN for EXTENSION, CLOSED for MODIFICATION.

Lets try to reflect on the above statement- software entities once written shouldn’t be modified to add new functionality, instead one has to extend the same to add new functionality. In otherwords you don’t touch the existing modules thereby not disturbing the existing functionality, instead you extend the modules to implement the new requirement. So your code is less rigid and fragile and also extensible. (See Reference)

Lets look at the code below which draws triangle and rectangle:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class OCPViolation {
	class Drawer{
		public void drawRectangle(Rectangle shape){
			System.out.println("Rectangle is drawn");
		}
		
		public void drawTriangle(Triangle shape){
			System.out.println("Triangle is drawn");
		}
	}

	class Rectangle{}
	
	class Triangle{}
	
	public static void main(String[] args) {
		OCPViolation test = new OCPViolation();
		
		Drawer drawer = test.new Drawer();
		Rectangle rect = test.new Rectangle();
		Triangle tri = test.new Triangle();
		
		drawer.drawRectangle(rect);
		drawer.drawTriangle(tri);
	}
}

Code above violates OCP principle, because if a new shape is required to be drawn, it needs change in Drawer so refactor code as below to be OCP compatible:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class OCPCompatible {
	class Drawer {
		public void draw(Shape shape) {
			shape.draw();
		}
	}

	interface Shape {
		public void draw();
	}

	class Rectangle implements Shape {
		public void draw() {
			System.out.println("Rectangle is drawn");
		}
	}

	class Triangle implements Shape {
		public void draw() {
			System.out.println("Triangle is drawn");
		}
	}

	public static void main(String[] args) {
		OCPCompatible test = new OCPCompatible();

		Drawer drawer = test.new Drawer();
		Rectangle rect = test.new Rectangle();
		Triangle tri = test.new Triangle();

		drawer.draw(rect);
		drawer.draw(tri);
	}
}
....

Single-Responsibility Principle (SRP)

This principle is S of S.O.L.I.D design principles.
According to Single Responsibility Principle, Every class should have a single responsibility: It should have a single purpose in the system, and there should be only one reason to change it.

The SRP is one of the simplest of the principle , and one of the hardest to get right. 

A detailed description with an example can be found here

Liskov Substitution Principle (LSP)

This principle is L of S.O.L.I.D design principles.

According to Liskov Substitution Principle, Subtypes must be substitutable for super type i.e. methods or functions which uses super class type must be able to work with object of sub class without any issue”. LSP is closely related to Single responsibility principle and Interface Segregation Principle. If a class has more functionality than subclass might not support some of the functionality and does violated LSP. In order to follow LSP design principle, derived class or sub class must enhance functionality not reducing it. (See Reference)

How can we identify LSP violation?

 Derived class may require less functionalities than the Base class, so some methods would be redundant. We might be using IS-A to check for Super-Sub relationships, but LSP doesn’t use only IS-A, but it also requires that the Sub types must be substitutable for the Super class. And one cannot decide the substitutability of sub class in isolation. One has to consider how the clients of the class hierarchy are going to use it. (See Reference)

Lets take look at the code below which violates LSP by binding swim and fly functionality to Base class Bird and use this functionalities by sub classes.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.ArrayList;  
 import java.util.List;  
 /*  
  * This class demonstrates Liskov Substitution Principle  
  */  
 public class LSPViolation {  
      abstract class Bird{  
           public abstract String getName();  
           public void sound(){  
                System.out.println(getName() + " sounds");  
           }  
           public void fly(){  
                System.out.println(getName() + " flies");  
           }  
           public void swim(){  
                System.out.println(getName() + " swims");  
           }  
      }  
      class Canary extends Bird{  
           public void swim(){  
                throw new UnsupportedOperationException( 
                                          "Canary can not swim");  
           }  
           public String getName() {  
                return "canary";  
           }  
      }  
      class Penguin extends Bird{  
           public String getName() {  
                return "penguin";  
           }  
           public void fly(){  
                throw new UnsupportedOperationException( 
                                          "penguin can not fly");  
           }  
      }  
      public static void main(String[] args) {  
           LSPViolation lspViolation = new LSPViolation();  
           List<Bird> birds = new ArrayList<Bird>();  
           birds.add(lspViolation.new Penguin());  
           birds.add(lspViolation.new Canary());  
           for (Bird bird : birds){  
                bird.sound();  
                bird.swim();  
                bird.fly();  
           }  
      }  
 }  

When we run above code, boom!

 penguin sounds  
 penguin swims  
 Exception in thread "main" java.lang.UnsupportedOperationException: penguin can not fly  
   at LSPViolation$Penguin.fly(LSPViolation.java:40)  
   at LSPViolation.main(LSPViolation.java:54)  

So lets fix it by seperating responsibilities as SwimmableBird and FlyableBird:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 /*  
  * This class demonstrates Liskov Substitution Principle  
  */  
 public class LSPCompatible {  
      abstract class Bird{  
           public abstract String getName();  
           public void sound(){  
                System.out.println(getName() + " sounds");  
           }  
      }  
      abstract class FlyableBird extends Bird{  
           public void fly(){  
                System.out.println(getName() + " flies");  
           }  
      }  
      abstract class SwimmableBird extends Bird{  
           public void swim(){  
                System.out.println(getName() + " swims");  
           }  
      }  
      class Canary extends FlyableBird{  
           public String getName() {  
                return "canary";  
           }  
      }  
      class Penguin extends Bird{  
           public String getName() {  
                return "penguin";  
           }  
      }  
 }  
.

Friday, December 28, 2012

Construct Comma Seperated String from List

Ihtiyac bir cogumuzun muhakkak karsilastigi, bir liste'den icindeki elemanlari bir seperator ile ayiran string olustumak. Benim de yaptigim ve bir cok kod'da karsilastigim hic te hos olmayan bir yontem: Efendim liste null mudur, bos mudur, dolu mudur kontrolu, sonrasinda liste for dongusunde taranir, her bir item'in sonuna seperator eklenir, bir stringBuffer'a append edilir, son item'dan sonra virgul koymamak icin if check'i yapilir falan derken hic te yakisikli olmayan kod ortaya cikar. 

Iyi de Apache Commons bunu bizim icin zaten en guzelinden yapiyor ki

 import java.util.ArrayList;  
 import java.util.List;  
 import org.apache.commons.lang.StringUtils;  
 public class Gunaydin {  
   public static void main(String[] args) {  
     List<String> list = new ArrayList<String>();  
     list.add("ahmet");  
     list.add("mehmet");  
     list.add("mustafa");  
     List<String> list2 = null;  
     // Join all Strings in the Array into a Single String, separated by $#$  
     System.out.println(StringUtils.join(list, "$#$"));  
   }  
 }  


Outputs:

 ahmet$#$mehmet$#$mustafa  

Just for clean codings..

Regular Expressions Reference Guide

Regular expressions really ease to much string operations and validations instead of applying legacy methodologies. Being comfortable in regular expressions depends just practicing :) whenever has a chance to apply. Below is a list of regular expresssion constructs referenced from tutorial on oracle. There are also some examples with really good explanations at mkyong.

 Just for quality coding...

 Character Classes

Construct Description
[abc] a, b, or c (simple class)
[^abc] Any character except a, b, or c (negation)
[a-zA-Z] a through z, or A through Z, inclusive (range)
[a-d[m-p]] a through d, or m through p: [a-dm-p] (union)
[a-z&&[def]] d, e, or f (intersection)
[a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction)
[a-z&&[^m-p]] a through z, and not m through p: [a-lq-z] (subtraction)

Negation

To match all characters except those listed, insert the "^" metacharacter at the beginning of the character class. This technique is known as negation.

Ranges

To specify a range, simply insert the "-" metacharacter between the first and last character to be matched, such as [1-5] or [a-h]

Unions

You can also use unions to create a single character class comprised of two or more separate character classes. To create a union, simply nest one class inside the other, such as [0-4[6-8]]. This particular union creates a single character class that matches the numbers 0, 1, 2, 3, 4, 6, 7, and 8.

Intersections

To create a single character class matching only the characters common to all of its nested classes, use &&, as in [0-9&&[345]]. This particular intersection creates a single character class matching only the numbers common to both character classes: 3, 4, and 5.

Subtraction

Finally, you can use subtraction to negate one or more nested character classes, such as [0-9&&[^345]]. This example creates a single character class that matches everything from 0 to 9, except the numbers 3, 4, and 5.

Predefined Character Classes

Construct Description
. Any character (may or may not match line terminators)
\d A digit: [0-9]
\D A non-digit: [^0-9]
\s A whitespace character: [ \t\n\x0B\f\r]
\S A non-whitespace character: [^\s]
\w A word character: [a-zA-Z_0-9]
\W A non-word character: [^\w]

 

Quantifiers

Quantifiers allow you to specify the number of occurrences to match against.

Greedy Reluctant Possessive Meaning
X? X?? X?+ X, once or not at all
X* X*? X*+ X, zero or more times
X+ X+? X++ X, one or more times
X{n} X{n}? X{n}+ X, exactly n times
X{n,} X{n,}? X{n,}+ X, at least n times
X{n,m} X{n,m}? X{n,m}+ X, at least n but not more than m times

Boundary Matchers

Boundary Construct Description
^ The beginning of a line
$ The end of a line
\b A word boundary
\B A non-word boundary
\A The beginning of the input
\G The end of the previous match
\Z The end of the input but for the final terminator, if any
\z The end of the input

Usage of Pattern and Matcher :

java.util.regex.Pattern pattern = Pattern.compile(regex);
java.util.regex.Matcher matcher = pattern.matcher(searchString);

while (matcher.find()) {
                System.out.println(String.format("I found the text"
                        + " \"%s\" starting at "
                        + "index %d and ending at index %d.%n",
                        matcher.group(), matcher.start(), matcher.end());
}

Monday, November 12, 2012

Don’t reinvent the wheel

Use guava libraries for most of utility needs you face while developing.

"Guava project contains several of Google's core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth."

Anti RDBMS

A good article about when and why to use NO-SQL storage systems : http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores

Check http://www.couchbase.com

Sunday, October 14, 2012

Simple Producer Consumer With LinkedBlockingQueue

Here is a simple Producer/Consumer sample using java.util.concurrent.LinkedBlockingQueue. Simply, Cachiers process tasks waiting in dropbox produced by Producer.

Task class which is processed by Cachier:

 public class Task {  
      private int taskNumber;  
      public Task(int taskNumber) {  
           this.setTaskNumber(taskNumber);  
      }  
      public void setTaskNumber(int taskNumber) {  
           this.taskNumber = taskNumber;  
      }  
      public int getTaskNumber() {  
           return taskNumber;  
      }  
 }  

Dropbox class is the box that tasks are dropped in. This class has LinkedBlockingQueue containing task objects to be processed with max size 20


 import java.util.concurrent.LinkedBlockingQueue;  
 public class Dropbox {  
      LinkedBlockingQueue<Task> blockingQueue = new LinkedBlockingQueue<Task>(20);  
      public Task take() throws InterruptedException {  
           return blockingQueue.take();  
      }  
      public void put(Task t) throws InterruptedException {  
           blockingQueue.put(t);  
      }  
 }  

Producer is responsible from producing tasks and putting them to DropBox. If dropbox reaches its limit, producer thread will be blocked till queue has empty slot


 public class Producer implements Runnable {  
      private Dropbox d;  
      public Producer(Dropbox d) {  
           this.d = d;  
      }  
      @Override  
      public void run() {  
           int i = 0;  
           while (true) {  
                Task t = new Task(i++);                 
                try {  
                     d.put(t);  
                     System.out.println(t.getTaskNumber() + " is added");  
                } catch (InterruptedException e) {  
                     e.printStackTrace();  
                }  
           }  
      }  
 }  

Cachier is consumer and responsible from processing tasks, it waits till dropbox has a task to be processed

 public class Cashier implements Runnable {  
      private Dropbox d;  
      private String name;  
      public Cashier(Dropbox d, String name) {  
           this.d = d;  
           this.name = name;  
      }  
      @Override  
      public void run() {  
           while (true) {  
                try {  
                     Task t = d.take();  
                     System.out.println("Processing " + t.getTaskNumber() + " by "  
                               + name);  
                     Thread.sleep(1000);  
                } catch (InterruptedException e1) {  
                     // TODO Auto-generated catch block  
                     e1.printStackTrace();  
                }  
           }  
      }  
 }  

Here is the main class starting application with 1 producer and 3 consumer

 public class Main {  
      public static void main(String[] args) {  
           Dropbox d = new Dropbox();  
           Producer p = new Producer(d);  
           Cashier c1 = new Cashier(d, "Ahmet");  
           Cashier c2 = new Cashier(d, "Mehmet");  
           Cashier c3 = new Cashier(d, "Fatih");  
           new Thread(c1).start();  
           new Thread(c2).start();  
           new Thread(c3).start();  
           new Thread(p).start();  
      }  
 }  

Friday, October 12, 2012

Scenes From Software Development Life :)




Uploading File with Apache Commons File Upload

To upload file into server and reading uploaded file, we need following apache packages;

http://hc.apache.org/httpcomponents-client-ga/

http://commons.apache.org/fileupload/

Client code is as below, it is just posting a file and string parameter into a servlet:


 import java.io.File;  
 import java.io.IOException;  
 import org.apache.http.HttpResponse;  
 import org.apache.http.client.ClientProtocolException;  
 import org.apache.http.client.HttpClient;  
 import org.apache.http.client.methods.HttpPost;  
 import org.apache.http.entity.mime.MultipartEntity;  
 import org.apache.http.entity.mime.content.FileBody;  
 import org.apache.http.entity.mime.content.StringBody;  
 import org.apache.http.impl.client.DefaultHttpClient;  
 public class UploadFile {  
   public static void main(String[] args) throws ClientProtocolException, IOException {  
     HttpClient client = new DefaultHttpClient();  
     String url = "http://127.0.0.1:8080/servlet";  
     HttpPost post = new HttpPost(url);  
     File file = new File("c:\\sil\\SID.jpg");  
     MultipartEntity entity = new MultipartEntity();  
     entity.addPart("file", new FileBody(file));  
     entity.addPart("parameter", new StringBody("value"));      
     post.setEntity(entity);  
     HttpResponse response = client.execute(post);  
     System.out.println(response);  
   }  
 }  

How uploaded file and http parameter can be processed in servlet side?

  public SmsForm processRequest(HttpServletRequest request) throws IOException, ServletException {  
     String contentType = request.getContentType();      
     SmsForm smsForm = new SmsForm();          
     if ((contentType != null) && (contentType.startsWith("multipart/form-data"))) {  
       DiskFileUpload fu = new DiskFileUpload();  
       fu.setSizeMax(100000);  
       fu.setSizeThreshold(4096);  
       fu.setRepositoryPath(System.getProperty("java.io.tmpdir"));  
       try {  
         List fileItems = fu.parseRequest(request);  
         Iterator iter = fileItems.iterator();  
         while (iter.hasNext()) {  
           FileItem item = (FileItem) iter.next();  
           String fileName = item.getName();  
           if (item.getName() == null) {  
             String fieldName = item.getFieldName();              
             smsForm.setField(fieldName, item.getString());              
           } else {  
             smsForm.setFile(item);  
           }  
         }  
       } catch (Exception e) {  
         e.printStackTrace();  
       }        
     }   
   }  

Placing Build Details into MANIFEST.MF via ANT / Maven

If it is needed to place build details into MANIFEST.MF file under META-INF directory of jar file, that can be accomplished via ANT in build.xml as below

      <tstamp>  
           <format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" />  
      </tstamp>  
      <target name="build" depends="compile">  
           <war warfile="${dist.home}\${dist.war}" basedir="${deploy.home}" webxml="${deploy.home}\WEB-INF\web.xml" excludes="javadoc">  
             <manifest>               
              <attribute name="Built-By" value="${user.name}"/>            
                 <attribute name="Built-Date" value="${TODAY}" />       
              <attribute name="Implementation-Vendor" value="XXXX"/>  
              <attribute name="Implementation-Title" value="${app.name}"/>  
              <attribute name="Implementation-Version" value="${release.number}"/>               
             </manifest>  
           </war>  
      </target>  

Just put required attributes between manifest tag of war or jar task. Output of MANIFEST.MF file would be as below:

 Manifest-Version: 1.0  
 Ant-Version: Apache Ant 1.7.1  
 Created-By: 14.2-b01 (Sun Microsystems Inc.)  
 Built-By: fkul  
 Built-Date: 2012-10-12 17:18:20  
 Implementation-Vendor: XXXX  
 Implementation-Title: product  
 Implementation-Version: 01_01_00_Build01  



Additionally, how those attributes in MANIFEST.MF can be read? As below:

   public static String getBuildDetails() throws MalformedURLException, IOException {  
     Class clazz = ThisClass.class;  
     String className = clazz.getSimpleName() + ".class";  
     String classPath = clazz.getResource(className).toString();  
     if (!classPath.startsWith("jar")) {  
       // Class not from JAR  
       return null;  
     }  
     System.out.println("ClassPath=" + classPath);  
     String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + "/META-INF/MANIFEST.MF";  
     System.out.println("ManifestPath=" + manifestPath);  
     Manifest manifest = new Manifest(new URL(manifestPath).openStream());  
     Attributes attr = manifest.getMainAttributes();  
     return attr.getValue("Implementation-Title") + " : " + attr.getValue("Implementation-Version");  
   }  

By shipping build details in MANIFEST.MF and reading them on runtime is a good idea to inform user of product on runtime as which version of product is currently running.

In Maven

If you are using maven, that can be accomplished in pom as below:

<properties>
     <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
</properties>

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-war-plugin</artifactId>
 <version>2.3</version>
 <configuration>
   <archive>
  <manifest>
    <addClasspath>true</addClasspath>
  </manifest>
  <manifestEntries>            
   <Built-Date>${maven.build.timestamp}</Built-Date>            
   <Implementation-Vendor>${vendor}</Implementation-Vendor>
   <Implementation-Title>${name}</Implementation-Title>
   <Implementation-Version>${version}</Implementation-Version>
  </manifestEntries>
   </archive>
 </configuration>
</plugin>

Monday, October 08, 2012

Oracle SID vs SERVICE_NAME

If you connect to ORACLE with SERVICE_NAME, you should define it as below


MADDB=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=172.28.106.152)
      (PORT=1552)
    )
    (CONNECT_DATA=
      (SERVICE_NAME=MADDB)
    )
  )

If you work with SID, you can define it at TOAD by clicking on checkbox while defining TNS name


which will be as below


MADDB=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=172.28.106.152)
      (PORT=1552)
    )
    (CONNECT_DATA=
      (SID=MADDB)
    )
  )


What about connection URL?

To connect with SERVICE_NAME:

jdbc:oracle:thin:@172.28.106.152:1552/MADDB

To connect with SID:

jdbc:oracle:thin:@172.28.106.152:1552:MADDB

For details : http://www.rojotek.com/blog/2008/01/04/oracle-sid-service_name/

Wednesday, October 03, 2012

Shipping WSDL with Jar for JAX-WS Client

If you work with JAX-WS for webservice client, jax-ws needs wsdl file on runtime. For this purpose, it is better to ship wsdl file with your client code in jar file. Just put wsdl file at top level directory in jar file as below:
-JAR
----META-INF/
----wsdl/service.wsdl

Then, you can instantiate client port as below


 URL wsdlLocation = MyClass.class.getResource("/wsdl/service.wsdl");  
 MyService service = new MyService(wsdlLocation);  
 MyPort proxy = service.getBasicHttpBindingPort();  
 ((BindingProvider) proxy).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceEndPointUrl);  

.

Thursday, September 20, 2012

Blogger Code Formatter

Blog'da yayinladigimiz kaynak kodlari formatlamak icin oldukca kullanisli bir formatter:

http://hilite.me/

Yakisikli kod'lar dilegiyle.

Pooling and Reusing JAX-WS Client Ports


Load test'leri icin hazirladigim bir simulator uygulamasinda, load altinda kisa bir sure sonra uygulamadan server'a yapilan webservice isteklerinde gecikmeler farkettik. Simulator uygulamasi, apache tomcat'da calisan bir web uygulamasi ve webservis istekleri icin jax-ws ile urettigimiz client kod'u kullaniyor.
Cagri yapan kod asagidaki gibi, her istek oncesinde servis ve port yaratip istekte bulunuyor


 public void callServer(){  
      XXXService service = new XXXService();  
      XXXServicePortType port = service.getXXXServiceHttpSoap11Endpoint();  
      WsUtil.setEndpointAdress(port, TestManager.SERVER_URL);  
      Response response = null;  
      try {  
           response = port.callServer();  
      } catch (SOAPFaultException e) {  
      }  
 }  
 public static void setEndpointAdress(final Object port, final String newAddress) {  
     final BindingProvider bp = (BindingProvider) port;  
     bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, newAddress);  
 }  

Sorunun nedenini bulmak, gecikme ve beklemelerin neden kaynaklandigini anlamak icin simulator uygulamasinin thread dump'ini inceledim.

 jstack <process Id>  

thread dump'in soyledigi, thread'lerin yeni servis objesi yaratirken, WSDL definition'ini yuklerken bekledikleri


 "pool-1-thread-400" prio=3 tid=0x0000000002101800 nid=0x215 waiting for monitor entry [0xfffffd7ff2c35000]  
   java.lang.Thread.State: BLOCKED (on object monitor)  
     at org.apache.axis2.jaxws.ClientConfigurationFactory.getClientConfigurationContext(ClientConfigurationFactory.java:88)  
     - waiting to lock <0xfffffd7f8626c060> (a org.apache.axis2.jaxws.ClientConfigurationFactory)  
     at org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl.createServiceDescription(DescriptionFactoryImpl.java:92)  
     at org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl.createServiceDescription(DescriptionFactoryImpl.java:79)  
     at org.apache.axis2.jaxws.description.DescriptionFactory.createServiceDescription(DescriptionFactory.java:76)  
     at org.apache.axis2.jaxws.spi.ServiceDelegate.<init>(ServiceDelegate.java:212)  
     at org.apache.axis2.jaxws.spi.Provider.createServiceDelegate(Provider.java:59)  
     at javax.xml.ws.Service.<init>(Service.java:56)  
     at com.xxx.xxx.xxx.XXXService.<init>(XXXService.java:47)  


Kisaca, her webservice istegi oncesi yeni servis ve port objesi olusturup, WSDL definition'ini yukletmek ve yuklerken alt tarafta kuvvetle muhtemel syncronized bir block'ta zaman kaybetmek pekte mantikli degil.

Pooling bir cozum olacaktir.

Uygulama ayaga kalkarken, kullanacagimiz port'lari ihtiyacimiz kadar yaratip bir queue'da tutmak ve bu havuzdan kullanmak, kullandiktan sonra queue'ya baskalarinin kullanmasi icin koymak uygun olacaktir.


 static BlockingQueue<XXXServicePortType> portQueue = new LinkedBlockingQueue<XXXServicePortType>();  
 public static void initialize() {  
      try {  
           long start = System.currentTimeMillis();  
           int portCount = Integer.parseInt(TestManager.PORT_POOL_COUNT.trim());  
           for (int i = 0; i < portCount; i++) {  
                XXXService service = new XXXService();  
                XXXServicePortType port = service.getXXXServiceHttpSoap11Endpoint();  
                WsUtil.setEndpointAdress(port, TestManager.SERVER_URL);  
                try {  
                     portQueue.put(port);  
                } catch (InterruptedException e) {  
                     e.printStackTrace();  
                }  
           }  
           TestManager.debug("Producing ports took " + (System.currentTimeMillis() - start));  
      } catch (Exception e) {  
           TestManager.error("", e);  
      }  
 }  
 public void callServer(){  
      XXXServicePortType port = null;  
      Response response = null;  
      try {  
           long l = System.currentTimeMillis();  
           port = portQueue.take();        
           TestManager.debug("Taking port took:[" + (System.currentTimeMillis() - l) + " msec");                 
           response = port.callServer();  
      } catch (InterruptedException e) {  
           e.printStackTrace();  
      } finally{  
           if (port != null){  
                try {  
                     portQueue.put(port);  
                } catch (InterruptedException e) {  
                     e.printStackTrace();  
                }  
           }  
      }  
 }  


Pooling bize gozle gorulur, ciddi bir iyilesme kazandirdi. Ek olarak her bir port ve kullandigi fiziksel connection arasindaki iliskiden bahsetmek gerekirse:

netstat -n komutu ile load sirasinda server'a kurulan fiziksel baglanti'lari inceledigimde sunu gordum. Pool kullandigimizda, cagrilan url ayni oldugu durumda, port sayisinca connection yaratildigini ve operating system tarafindan canli tutuldugunu gordum. Havuzdaki client port objeleri, canli tutulan bu fiziksel http connection'larini her seferinde kullaniyorlar.

Cagrilan url'i anlik olarak degistirdigim durumda ise operating system yeni bir connection yaratiyor ve port objesi bu yeni connection uzerinden http call yapiyor. Bir sekilde fiziksel connection yonetimi operating system tarafindan yapiliyor ve kisaca port objesinin o anda cagiracagi ip:port icin hazirda bir http connection var ise o kullaniliyor, yok ise yaratiliyor.

SONUC OLARAK:

Webservice cagrisinda asil maliyetli olan service ve port objelerini her seferinde yaratip servis tanimini (WSDL dosyasini) yukletmek oldugunu gorduk, ve bunun yerine port objelerini ayaga kalkarken yaratip bir havuzda tutup tekrar tekrar kullanmak cozumunu uyguladik.

Fiziksel http connection yonetimi ise alt tarafta bir sekilde handle ediliyor ve dikkate deger bir maliyeti olmadigini soyleyebilirim.

Monday, September 17, 2012

Managing cache with Ehcache

IHTIYAC:

 Uretmesi ve elde etmesi maliyetli olan entity'leri olasi sonradan ihtiyaclarda tekrardan uretmek yerine memory'de tutuyoruz, Bunu basitce entity'leri bir ConcurrentHashMap'de tutup, ihtiyac duydugumuz anda da ulasarak sagliyabiliriz. Ancak outOfMemory almamak icin map'de tuttugumuz bu objelerin belli bir sure sonra expire olmalarini saglamali, hatta Map'de tuttugumuz objelerin sayisini da limitli tutmamiz lazim. Bunun icin belli araliklarda calisan bir TimerTask'imiz var, ve Map'deki entity'leri tarayarak, suresi gecmis entity'leri Map'den temizliyoruz.

Butun bu isi kendimiz manage etmek yerine bunu bizim icin belki de daha optimize yapan bir urun var ehcache.

 Ufak bir test kod'u ile kullanimina bakalim. TTL degerimiz 2 sn, yani cach'e koydugumuz obje 2 sn sonra expire olmali ve cache en fazla 100 eleman bulundurmali, eleman sayisi bunu artarsa, first in first out mantigi ile eski elaman'lar cache'den atilip yerine yenileri konmali:

Dependency'lerimiz:

 <dependencies>  
   <dependency>  
    <groupId>junit</groupId>  
    <artifactId>junit</artifactId>  
    <version>4.7</version>  
    <scope>test</scope>  
   </dependency>  
   <dependency>  
       <groupId>net.sf.ehcache</groupId>  
       <artifactId>ehcache</artifactId>  
       <version>2.0.0</version>  
       <type>pom</type>  
      </dependency>  
      <dependency>  
           <groupId>org.slf4j</groupId>  
           <artifactId>slf4j-log4j12</artifactId>  
           <version>1.5.6</version>  
      </dependency>  
 </dependencies>  

Test Code'u:

 import net.sf.ehcache.Cache;  
 import net.sf.ehcache.CacheManager;  
 import net.sf.ehcache.Element;  
 import net.sf.ehcache.config.CacheConfiguration;  
 import org.junit.Before;  
 import org.junit.Test;  
 /**  
  * Unit test for simple App.  
  */  
 public class AppTest  
 {  
   public static final int TTL_IN_SEC = 2;  
   public static final int MAX_ELEMENT_IN_MEMORY = 100;  
   static {  
     CacheManager manager = CacheManager.create();  
     //Create a Cache specifying its configuration.  
     Cache cache = new Cache(new CacheConfiguration("myCache", 1000).timeToLiveSeconds(TTL_IN_SEC).maxElementsInMemory(100));  
     manager.addCache(cache);  
   }  
   @Before  
   public void init() throws Exception {  
     Cache cache = CacheManager.getInstance().getCache("myCache");  
     Element e = new Element(1, "test");  
     cache.put(e);  
   }  
   @Test  
   public void shouldRemoveAfterTTL() throws Exception {  
     Cache cache = CacheManager.getInstance().getCache("myCache");  
     Element e = cache.get(1);  
     org.junit.Assert.assertEquals(e.getValue(), "test");  
     System.out.println("hit value by 1 = " + e);  
     System.out.println("sleep by TTL + 1 sec ");  
     Thread.sleep(TTL_IN_SEC * 1000 + 1000);  
     e = cache.get(1);  
     org.junit.Assert.assertNull(e);  
     System.out.println("hit value by 1 = " + e);  
   }  
   @Test  
   public void shouldRemoveFirstElementWhenCacheFull() throws Exception {  
     Cache cache = CacheManager.getInstance().getCache("myCache");  
     Element e = cache.get(1);  
     System.out.println("hit value by 1 = " + e);  
     org.junit.Assert.assertEquals(e.getValue(), "test");  
     for (int i = 2; i &lt;= 2 * MAX_ELEMENT_IN_MEMORY; i++) {  
       e = new Element(i, "test" + i);  
       cache.put(e);  
     }  
     e = cache.get(1);  
     org.junit.Assert.assertNull(e);  
     System.out.println("xxhit value by 1 = " + e);  
   }  
 }  

Hizli ve optimize yazilimlar dilegiyle.

Thursday, September 06, 2012

Throttling with RabbitMQ

Broadcasting with Hazelcast


Farkli host'larda clustered calisan uygulamalarimizin birbirleri ile haberlesmelerine ihtiyacimiz var. Host'lardan birinde gerceklesen bir event'in diger hostlar tarafindan haberdar edilmesi lazim. Bu amacla ve daha bir cok ozelligi ile (distributed caching, load balancing, publish/subscriber messaging) ve en onemlisi kullanim basitligi ile Hazelcast kullanabiliriz.

Asagida Hazelcast kullanarak bir broadcasting ornegi yapalim.

Dependency'miz

 <dependency>  
      <groupId>com.hazelcast</groupId>  
      <artifactId>hazelcast</artifactId>  
      <version>2.2</version>  
 </dependency>  

Hazelcast servisimizi ayaga kaldiralim:

    import org.apache.log4j.Logger;   
    import com.hazelcast.config.Config;   
    import com.hazelcast.config.Join;   
    import com.hazelcast.config.NetworkConfig;   
    import com.hazelcast.core.Hazelcast;   
    import com.hazelcast.core.HazelcastInstance;   
    import com.hazelcast.core.MultiTask;   

    public class HazelcastService{  

    public static Logger    logger = Logger.getLogger(HazelcastService.class);   
    private static HazelcastInstance hazelcastInstance;   
    private static boolean   initialized = false;   

    public void deploy() {   
    logger.info("INITIALIZING HAZELCAST......");   
    try {   
     System.setProperty("hazelcast.logging.class",    HazelcastLoggerFactory.class.getName());    
     Config cfg = new Config();   
     cfg.setPort(ServiceProperties.HAZELCAST_PORT);   
     cfg.setPortAutoIncrement(true);   
     NetworkConfig network = cfg.getNetworkConfig();   
     Join join = network.getJoin();   
     join.getMulticastConfig().setEnabled(false);   
     String ips = ServiceProperties.HAZELCAST_CLUSTER_HOST_IPS_SEPERATED_BY_COMMA;   
     StringTokenizer tok = new StringTokenizer(ips, ",");   
     while (tok.hasMoreTokens()) {   
      join.getTcpIpConfig().addMember(tok.nextToken());   
     }   
     join.getTcpIpConfig().setEnabled(true);   
     hazelcastInstance = Hazelcast.newHazelcastInstance(cfg);   
     initialized = true;   
    } catch (Exception e) {   
     logger.error(e);   
    }   
    logger.info("INITIALIZED HAZELCAST......");   
   }   
 }  

Mesaj gonderimini tetikleyelim:

 public static void notifyEvent(String eventId) {  
     if (!initialized) {  
       logger.warn("HazelcastService is not initialized, doint nothing");  
       return;  
     }  
     try {  
       Event event = new Event(eventId);  
       MultiTask<Boolean> task = new MultiTask<Boolean>(event, hazelcastInstance.getCluster().getMembers());        
       broadcast(task);  
     } catch (Exception e) {  
       logger.error(e);  
     }  
   }  
      private static void broadcast(MultiTask<Boolean> task) throws InterruptedException, ExecutionException, TimeoutException {  
     ExecutorService executorService = hazelcastInstance.getExecutorService();  
     executorService.execute(task);  
     Collection<Boolean> results = task.get(3, TimeUnit.SECONDS);  
     logger.info("Call Results: " + Arrays.toString(results.toArray()));  
   }  

Diger hostlarda mesaj'i karsilayacak class'imiz

 public class Event implements Callable<Boolean>, Serializable {  
   protected String eventId;  
   public PricePlanUpdated(eventId) {  
     super();  
     this.eventId = eventId;      
   }  
   public Boolean call() {  
     try {  
       HazelcastService.logger.info("Received event message with eventId:" + eventId);  
       //do job  
       HazelcastService.logger.info("Processed event message with eventId:" + eventId);  
     } catch (Exception e) {  
       HazelcastService.logger.error(e);  
     }  
     return true;  
   }    
 }  

That's all.

Wednesday, August 15, 2012

Oracle'da Tablo uzerinde LOCK kullanimi

Bugunumden DB ogrenilerim asagidaki gibi.

1.) Ayni tablo uzerinde sadece 1 instance'in o anda calismasini garanti etmek istiyor isek tablo ustunde lock'lamayi SELECT FOR UPDATE komutu ile asagidaki sekilde yapabiliriz.



SELECT * FROM TABLE FOR UPDATE 

Bu komut sonrasinda, o session disinda baska session'dan bu tabloya yapilan istekler, lock'i alan connection'inin commit ya da rollback cagirmasina kadar bekleyeceklerdir. Lock'i alan session, bu sure boyunca bu tabloda istedigi select/update/delete islemlerini gerceklestirebilecektir.

2.) Peki tablolar uzerinde lock'lari nasil goruyor ve kaldiriyoruz:

 select oracle_username,object_id,session_id from v$locked_object

ilgili session'in serial numarasini aliyoruz:

 select sid,serial# from v$session where sid=<session_id>;

ve session'i oldurup manueal olarak lock'i kaldirma icin:

 alter system kill session '<sId>,<serial#>';

3.) Tablodaki ilk n kaydi almak icin ise:

SELECT * FROM TABLE where ROWNUM <= n

Saturday, August 11, 2012

Eclipse'de Mavenized Web Projesi Olusturmak

Asagidaki adimlar izlenir
1.) Eclipse'de New Maven Project with archtpe maven-archetype-webapp
2.) Dependency'ler pom.xml'e girilir.
3.) Maven dependency'lerinin eclipse classpath'ine eklenmesi icin mvn eclipse:eclipse calistirilir.
4.) Eclipse projesi refresh edilir.
5.) WTP (Web Tools Platform) yuklu oldugundan emin olun
Help ->Install menusunden http://download.eclipse.org/webtools/repository/helios repository'sinden yuklenebilir.
6.) Bu projeyi dynamic web project haline ceviren sihirli komut: mvn eclipse:eclipse -Dwtpversion=2.0
7.) Bu asamada proje Eclipse embedded Tomcat ustunde calisir hale gelmistir. Tomcat, projeyi yuklerken maven dependency'lerini goremiyor ise son care olarak:
8.) Proje uzerinden Properties -> Deployment Assembly -> Add -> Java Build Path Entries -> burdaki listeden maven dependency'leri secilerek Tomcat classpath'ine eklenmesi saglanir.