Wednesday, June 25, 2014

JAX-RS Download File Using Jersey API

In this example we are going to see how you can download a file from a JAX-RS REST Service. It's easy to do that, as it requires to annotate the bind method with the @Produces annotation. The @Produces annotation can used to used to specify the MIME media types a service can produce and send to the client. In this example we are going to see how you can download text, image, PDF and excel files.
The second thing to note is that you have to attach the file to the response and then set the Content-Disposition header variable of the response. The Content-Disposition response-header field is used to dictate a a default file name if the user requests that the content is saved to a file. A simple example would be : Content-Disposition: attachment; filename="fname.ext". Using this, the user-agent will not display the response, but directly the pop up "Save as…" dialogue.

To download different file formats all you have to do is change the type registered in @Produces annotation.
  • @Produces("image/png") for images (you can change the "png" part according to the format of the image).
  • @Produces("application/pdf") for PDF files.
  • @Produces("application/vnd.ms-excel") for Excel files.


import java.io.File;


import javax.ws.rs.GET;

import javax.ws.rs.Path;

import javax.ws.rs.Produces;

import javax.ws.rs.core.Response;

import javax.ws.rs.core.Response.ResponseBuilder;


@Path("/files")

public class HelloWorldREST {


    // The file paths of the files in the server

    private static final String TXT_FILE = "C:\\test.txt";

    private static final String IMAGE_FILE = "C:\\test.png";

    private static final String PDF_FILE = "C:\\test.pdf";

    private static final String EXCEL_FILE = "C:\\test.xls";


    /**

     *  Download Text File

     */

    @GET

    @Path("/txt")

    @Produces("text/plain")

    public Response getTextFile() {


        File file = new File(TXT_FILE);


        ResponseBuilder response = Response.ok((Object) file);

        response.header("Content-Disposition", "attachment; filename=\"test_text_file.txt\"");

        return response.build();


    }


    /**

     *  Download Image File

     */

    @GET

    @Path("/images")

    @Produces("image/png")

    public Response getImageFile() {


        File file = new File(IMAGE_FILE);


        ResponseBuilder response = Response.ok((Object) file);

        response.header("Content-Disposition", "attachment; filename=\"test_image_file.png\"");

        return response.build();


    }


    /**

     *  Download PDF File

     */

    @GET

    @Path("/pdf")

    @Produces("application/pdf")

    public Response getPDF() {


        File file = new File(PDF_FILE);


        ResponseBuilder response = Response.ok((Object) file);

        response.header("Content-Disposition", "attachment; filename=\"test_PDF_file.pdf\"");

        return response.build();


    }


    /**

     *  Download Excel File

     */

    @GET

    @Path("/excel")

    @Produces("aapplication/vnd.ms-excel")

    public Response getExcell() {


        File file = new File(EXCEL_FILE);


        ResponseBuilder response = Response.ok((Object) file);

        response.header("Content-Disposition", "attachment; filename=\"test_excel_file.xls\"");

        return response.build();

    }


}


RESTFul Webservice: File Upload

File upload feature of html form works by wrapping the file content inside amultipart envelope as the content type "application/x-www-form-urlencoded" is inefficient for sending large quantities of binary data or text containing non-ASCII characters. The content type "multipart/form-data" should be used for submitting forms that contain files, non-ASCII data, and binary data.

  1. RESOLVE DEPENDENCY

    For the "multipart/form-data" support we need to include "jersey-multipart.jar" and dependencies from here [for glassfish v3.1 & upward you will find it in glassfish\modules].
  2. <html>
    <body>
        <h1>Upload File with RESTFul WebService</h1>
        <form action="rest/fileupload" method="post" enctype="multipart/form-data">
           <p>
            Choose a file : <input type="file" name="file" />
           </p>
           <input type="submit" value="Upload" />
        </form>
    </body>
    </html>

  3. JAVA FILE UPLOAD CLIENT

    We will use Apache HTTPClient library to resolve dependency. It is an optional step & the code could be exploited to build a test-client.
    HttpClient httpclient = new DefaultHttpClient();  
    HttpPost httppost = new HttpPost(url);  
    FileBody fileContent= new FileBody(new File(fileName));  
    StringBody comment = new StringBody("Filename: " + fileName);
    MultipartEntity reqEntity = new MultipartEntity();  
    reqEntity.addPart("file", fileContent);  
    httppost.setEntity(reqEntity);  
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity resEntity = response.getEntity();



  4. CREATE JAX-RS FILE UPLOAD SERVICE WITH JERSEY

  5. jersey uses  @FormDataParam to receive the uploaded file. to get the uploaded file name or header detail, compare with "FormDataContentDisposition" which represents a "content-disposition" header whose value is "form-data".

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;
@Path("/fileupload")
public class UploadFileService {
    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) {
        String uploadedFileLocation = "c://uploadedFiles/" + fileDetail.getFileName();
        // save it
        saveToFile(uploadedInputStream, uploadedFileLocation);
        String output = "File uploaded via Jersey based RESTFul Webservice to: " + uploadedFileLocation;
        return Response.status(200).entity(output).build();
    }
    // save uploaded file to new location
    private void saveToFile(InputStream uploadedInputStream,
        String uploadedFileLocation) {
        try {
            OutputStream out = null;
            int read = 0;
            byte[] bytes = new byte[1024];
            out = new FileOutputStream(new File(uploadedFileLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
TEST YOUR SERVICE
Deploy & Browse to {App_URL}/{File_Upload_html}
Upload A file and check.

Sunday, June 9, 2013

Differences between struts 1.x & struts 2.x


component and functional differences between struts 1.x  & struts 2.x

 In struts 1.x front controller is ActionServlet      In 2.x front controller is FilterDispatcher    In struts 1.x we have RequestProcessor class      In 2.x we have Interceptors instead RequestProcessor will see about this concept later just remember as of now    In struts 1.x we have multiple tag libraries like, html, logic, bean..etc      In 2.x we do not have multiple libraries, instead we have single library which includes all tags    In struts 1.x the configuration fine name can be [any name].xml and we used to place in web-inf folder      In 2.x the configuration file must be struts.xml only and this must be in classes folder    In struts 1.x we have form beans and Action classes separately      In 2.x form bean, Action classes are combinedly given as Action class only, of course we can take separately if we want ;)    In struts 1.x properties file must be configured in struts-config.xml      But in 2.x we need to configure our resource bundle(s) in struts.properties file    In struts 1.x we have programmatic and declarative validations only      In 2.x we have annotations support too along with programmatic and declarative validations  

Functional Differences

In struts 1.x declarative validations are done by using validation frame work      In 2.x, declarative validations are done by using xwork2 frame work by webwork the reason being, its support valuations through Annotations    In struts 1.x an Action class is a single ton class, so Action class object is not a thread safe, as a programmer we need to make it as thread safe by applying synchronization      In 2.x an Action class object will be created for each request, so it is by default thread safe, so we no need to take care about safety issues here    In struts 1.x we have only jsp as a view technology      In 2.x we have support of multiple view technologies like velocity, Freemarker, jasper reports, jsp bla bla    In struts 1.x Action class is having servlet dependency, because in execute() method accepts req, res parameter right ! so.      In 2.x Action class doesn't have any servlet dependency, because its execute() method doesn't accepts any parameters, however we can access all servlet objects with dependency injection  

Sunday, March 17, 2013

Compressing and Decompressing String in Java example of Deflater and Inflater of java.util.zip packate.

Compressing and Decompressing String in Java, using Deflater and Inflater of java.util.zip packate.

================================================================================================


package com.test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.Inflater;

public class CompressFromJavaUtill {

    /**
     * @param args
     * @author laxman Guatam
     *    laxmangautam@gmail.com
     */
    public static void main(String[] args) {
        String emailContent = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"
                + "<html><head>"
                + "<title>You're Invited to Oracle's OTN Developer Day!</title>"
                + "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">"
                + "</head><body>"
                + "<p>This DVD includes all the resources you need for the OTN Developer Day: Java Development</p>"
                + "<ul>"
                + "<li><a href=\"software/\">Required  Software</a> (see below)</li>"
                + "<li><a href=\"Std_materials/\">Hands on Lab Manuals and Source </a></li>"
                + "<li><a href=\"appliance/\">Virtual Box Appliance</a></li>"
                + "<li><a href=\"Readme_for_netbeans.doc\">NetBeans License Readme </a></li>"
                + "</ul>"
                + "<p><strong>Server Track - System Requirements </strong></p>"
                + "<p>Virtual Box  installation </p>" + "</body>";

        int length = emailContent.length();

        byte data[] = null;

        try {
            data = emailContent.getBytes("ISO-8859-1");
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
            Deflater defaulterObj = new Deflater();
            DeflaterOutputStream deflter = new DeflaterOutputStream(byteStream,
                    defaulterObj);
            deflter.write(data);
            deflter.close();
            data = byteStream.toByteArray();
            byteStream.close();
            System.out.println(" Array data is " + data.toString());
            String newCompressedData = new String(data);
            System.out.println(" Orginal Content is " + emailContent);
            System.out.println(" Orginal Size is " + emailContent.length());
            System.out.println(" Compressed Content is  " + newCompressedData);
            System.out.println(" Compressed Content Size is  "
                    + newCompressedData.length());

            System.out.println("Decompressing now:::::::::::::::::::::::");

            byte[] output = new byte[length];
            Inflater decompresser = new Inflater();
            decompresser.setInput(data, 0, data.length);
            int resultNew = decompresser.inflate(output);

            System.out.println("Out put is " + resultNew);

            String orginalText = new String(output);
            System.out.println(" Orginal Content is " + orginalText);

            System.out.println(" Is it equal. "
                    + orginalText.equals(emailContent));

        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (DataFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
===============================Out Put will be:=================================================

 Array data is [B@3e25a5
 Orginal Content is <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><title>You're Invited to Oracle's OTN Developer Day!</title><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"></head><body><p>This DVD includes all the resources you need for the OTN Developer Day: Java Development</p><ul><li><a href="software/">Required  Software</a> (see below)</li><li><a href="Std_materials/">Hands on Lab Manuals and Source </a></li><li><a href="appliance/">Virtual Box Appliance</a></li><li><a href="Readme_for_netbeans.doc">NetBeans License Readme </a></li></ul><p><strong>Server Track - System Requirements </strong></p><p>Virtual Box  installation </p></body>
 Orginal Size is 681
 
Compressed Content is  xœmRaoÓ0ý+·||È ¤®%ÚLZQ×NKÚ§ÊM®Ä±ƒ}é–Ϲ餡ñÅÒ=ß{~÷Îò¬Ø,ª‡Û+¸®nVpûc¾Z. Ë…øùa!DQÓÅÇ‹wPí¢!ã?¶B\­3%[ê,Ÿ¨%É?Eõà‡ó€°tCØ......

Decompressing now:::::::::::::::::::::::
Out put is 681
 Orginal Content is <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><title>You're Invited to Oracle's OTN Developer Day!</title><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"></head><body><p>This DVD includes all the resources you need for the OTN Developer Day: Java Development</p><ul><li><a href="software/">Required  Software</a> (see below)</li><li><a href="Std_materials/">Hands on Lab Manuals and Source </a></li><li><a href="appliance/">Virtual Box Appliance</a></li><li><a href="Readme_for_netbeans.doc">NetBeans License Readme </a></li></ul><p><strong>Server Track - System Requirements </strong></p><p>Virtual Box  installation </p></body>
 Is it equal. true



























Saturday, August 18, 2012

Web Start: Invalid thread access