Tuesday, October 9, 2012

Hide the browser toolbar in jsp

I am so tired with testers raising bugs they get when they click on the browser back button.
So, its better to hide the browser buttons altogether.

Here is the code.

My web.xml has my welcome file to index.jsp, which in turn just redirects the control to my Login.jsp.

web.xml


        /pages/Login.jsp

index.jsp

<%
response.sendRedirect("login.do");
%>

Where login.do is my action mapping.
Now, I change my index.jsp to



This opens my application in a new browser, where the browser toolbar and menubar do not appear...and I get rid of my Back and Forward button bugs. Hmpfffff!!!

Thursday, October 4, 2012

Read and wite a video in java

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class VideoTest {
    public static void main(String args[]) throws IOException {
        File file1 = new File("C:/Users/splashtechie/Pictures/test.mp4");
        FileOutputStream foStream = new FileOutputStream(file1);
        ByteArrayOutputStream oStream = new ByteArrayOutputStream();
        InputStream is2 = new FileInputStream("C:/Users/splashtechie/Videos/test.mp4");
        //InputStream is2 = rs.getBinaryStream(1);
        byte[] bytes = new byte[is2.available()];
        is2.read(bytes);
        oStream.write(bytes);
        System.out.println("writing....");
        oStream.writeTo(foStream);
       
        System.out.println("done!!!");
    }

}

Tuesday, September 25, 2012

Encryption and Decryption in Java

I had already written a post on the same earlier. But it works only when pass the encrypted value to the decryptor method before the SecretKey is generated again. This is because, each time we call to generate the SecretKey, it generates a new one each time.

I have found a solution to this. This comes handy when you are encrypting the data and storing it somewhere and later want to retrieve the data and decrypt it while doing so. This can be done using the 'AES' algorithm instead of the 'DES' used in the previous example.

The AES algorithm, generates the same SecretKey each time you generate it. Here is the implementation :

 private static final String ALGO = "AES";
        private static final byte[] keyValue =
            new byte[] { 'm', 'a', 'n', 'a', 's', 'w', 'i','t', 'a', '_', 'm','i', 's', 'h', 'r', 'a' };

/**
     * Encrypt the password before saving   
     * @param Data
     * @return
     * @throws Exception
     */
    public static String encrypt(String Data) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(Data.getBytes());
        String encryptedValue = new BASE64Encoder().encode(encVal);
        return encryptedValue;
    }

    /**
     * Decrypt the password before recieving
     * @param encryptedData
     * @return
     * @throws Exception
     */
    public static String decrypt(String encryptedData) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);
        byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
        byte[] decValue = c.doFinal(decordedValue);
        String decryptedValue = new String(decValue);
        return decryptedValue;
    }
    /**
     * Key Generator for encryption and decryption
     * @return
     * @throws Exception
     */
    private static Key generateKey() throws Exception {
        Key key = new SecretKeySpec(keyValue, ALGO);
        return key;
}

Here is a simple client to test the implementation above

public static void main(String[] args) throws Exception {
        String password = "password";
        String passwordEnc = AESencrp.encrypt(password);
        String passwordDec = AESencrp.decrypt(passwordEnc);

        // This key generates the same value each time you run it
        System.out.println(generateKey());

        System.out.println("Original password : " + password);
        System.out.println("Encrypted password: " + passwordEnc);
        System.out.println("Decrypted password: " + passwordDec);
    }

Thursday, September 13, 2012

Andriod App that uses Google App Engine as Backend

Now that was 4 days of tiresome job. But now that its finally done, I would like to post it to my blog. I would be happy if I can rescue anyone else who has been slogging like me.

So, I want to create an Android app that consumes data from an application hosted on the Google app Engine.
The first rule is to get the steps right. That was the basic mistake I did, by trying n no. of solutions without making a clear picture in my mind how to achieve it. Here are the basic steps to be taken in the same order they have been jotted down:

1. Create a GAE application that exposes your data in JSON or XML format. The example I would be mentioning below uses JSON. Publish it to GAE.

2. Create an Android Application. Preferably make an Hello Wold application first, so that you get a hang of things.

3. Now, change your Android app to access any public URL to see if you can read from it.

4. Finally, pass the URL of your GAE application.

Step 1:

public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException, ServletException {

        
resp.setContentType("text/plain");

        List list = new ArrayList();
        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

        Query fetchQuery = new Query("Offers");

        List pages = new ArrayList();

        pages =  datastore.prepare(fetchQuery).asList(FetchOptions.Builder.withDefaults()); 

............................

I assume, we are familiar with the above code snippet. This is going to fetch from your table on GAE.

for (Entity page: pages) {
            // Add the pojo as a JSONObject
            list.add(new JSONObject(page));
        }
        // Create a JSONArray based from the list of JSON Obejcts
        JSONArray jsonArray = new JSONArray(list);

        // Then output the JSON string to the servlet response
         resp.getWriter().println(jsonArray.toString());

The above code converts your list data into JSONObject and attaches it to the response object. And with this we complete the first step.


Step 4 : 

Now, in your android onCreate method, add the following code to access the JSON Object sent as a response from the GAE Application.

ArrayList listItems = new ArrayList();
            
            try {
                URL url= new URL(
                        "the GAE app URL here");
                URLConnection tc = url.openConnection();
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        tc.getInputStream()));
   
                String line;
                while ((line = in.readLine()) != null) {
                    JSONArray ja = new JSONArray(line);
   
                    for (int i = 0; i < ja.length(); i++) {
                        JSONObject jo = (JSONObject) ja.get(i);
                       
                        String obj=jo.getString("properties");
                        listItems.add(
obj);
                    }
                }
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return listItems;
        }

Assign the list to the TextView in your main.xml

TextView text = (TextView) findViewById(R.id.textviewId);
              for(String s: listItems){
                  sb.append(s+"\n");
              }
              text.setText(sb.toString());

And now you have a GAE application that posts data into a store and an Android Application that's listening.



Monday, March 28, 2011

Get the top 5th salary of all employees

SELECT SALARY FROM


(SELECT VAL1, RANK() OVER (ORDER BY VAL1 DESC) R from TEMPX)


WHERE R=5;


OR


SELECT DISTINCT (a.sal) FROM EMP A WHERE 5= (SELECT COUNT (DISTINCT (b.sal)) FROM EMP B WHERE a.sal<=b.sal);


Wednesday, January 19, 2011

Unable to install breakpoint due to missing line number attributes

It would stop you add a breakpoint to your code. The detailed error description that comes as a message box says

Unable to install breakpoint in xyz class due to missing line number attributes. modify compiler options to generate line number attributes.

Reason: Absent line number attributes in generated class file.

Solution:

1. Verify the class file generation options in eclipse

Go to windows > preferences > Java > compiler screen.

Make sure that add line number attributes to generated files (used by debugger) check box is checked.

2. In the build.xml, set debug attribute to true in the javac task.


Wednesday, January 12, 2011

How to add struts capability to a existing core java project

With my earlier projects where we had the struts plug in added to the eclipse. all we used to do is right click on the project and -> Add Struts capabilities. Here it doesn't work since the plug in isn't there. So here is the alternate approach.

1. Go to your Eclipse project folder and you should see a file named ".project" open the file.
2. Search for these lines org.eclipse.jdt.core.javanature
3. Change those lines to become
org.eclipse.jdt.core.javanature
org.eclipse.wst.common.project.facet.core.nature
org.eclipse.wst.common.modulecore.ModuleCoreNature
save the changes you have made.

4. Open one more file called “org.eclipse.wst.common.component” under your ".settings" folder inside your Eclipse project folder. If there is no ".settings" folder inside your project or empty one, you can use from other Eclipse Struts Project, just copy it over.

5. Change the some parameters
Pay attention to (you can ignore other, the application_name usually the Eclipse project name) :
the source-path is relative to the location of your .java files.
the deploy-path is relative to the location of your .class files.
the context-root is the application name, usually the war name or the war-extracted folder name on the server.

4. Close your Eclipse project and open it again.
5. Right click on your project and go to the Properties menu.
6. Choose the Project Facets, select Dynamic Web Module and Java by active the checkbox
respectively(for my case i choose version 2.5 for the Dynamic Web Module and 5 for Java). Click OK.

Hope it useful.

REFACTORING

 What is Refactoring? A software is built initially to serve a purpose, or address a need. But there is always a need for enhancement, fixin...