Thursday, September 20, 2012

JAXBcontext inside servlet context

You are trying to unmarshall an xml to a class in tomcat deployed app. The class you want to unmarshall to is in the included jar with the jaxb.index. But even then we get the error: failed to unmarshall, cannot find jaxb.index JAXB context inside servlet in tomcat. Because of classloader being different. If the classes being unmarshalled are in a dependent jar, it will not be caught by the class loader.JAXBContext get instance takes in the package to load and the classLoader where the package could be found. ClassLoader cl = Content.class.getClassLoader(); jaxbContext = JAXBContext.newInstance("com...domain", cl);

Tuesday, July 10, 2012

Jersey ApacheHttpClient with connection pooling

Using Jersey ApacheHttpClient
When using the jersey client. Make use you use ApacheHttpClient instead of jersey client.
http://jersey.java.net/nonav/apidocs/1.2/contribs/jersey-apache-client/com/sun/jersey/client/apache/ApacheHttpClient.html

This is the standard way you get the client

        MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
        connectionManager.getParams().setConnectionTimeout(connectTimeout);
        connectionManager.getParams().setSoTimeout(readTimeout);
        connectionManager.getParams().setDefaultMaxConnectionsPerHost(maxConnectionsPerHost);
        HttpClient httpClient = new HttpClient(connectionManager);
        ApacheHttpClientHandler httpClientHandler = new ApacheHttpClientHandler(httpClient);
        contentServerClient = new ApacheHttpClient(httpClientHandler);
        contentServerClient.setConnectTimeout(connectTimeout);
        contentServerClient.setReadTimeout(readTimeout);


once you get the client get the web resource from the uri

   WebResource resource = getContentServerClient().resource(contentServerUrl).path("streets").path("6708NE");

        try {
           Street street = resource.get(Street.class);
        } catch (UniformInterfaceException e) {
            throw new NoContentFoundException("Can't locate street for Id " + kaniId);
        }

Wednesday, August 3, 2011

SOAP web service with custom headers - SOAP Action

When calling .net webservices with custom headers don't forget the evilness of SOAPAction.

String operation = "HelloThere"; // "FetchMerchants"; // could
// also be
String destination = "http://localhost/interfaces/reseller/BusinessLayer/ResellerWS.asmx";

// First create the connection
SOAPConnectionFactory soapConnFactory = SOAPConnectionFactory
.newInstance();
SOAPConnection connection = soapConnFactory.createConnection();

// Next, create the actual message
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();

SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("xsd",
"http://www.w3.org/2001/XMLSchema");
envelope.addNamespaceDeclaration("xsi",
"http://www.w3.org/2001/XMLSchema-instance");
// This method demonstrates how to set HTTP and SOAP headers.
// setOptionalHeaders(message, envelope);
envelope.removeNamespaceDeclaration("soapenc");

// Create and populate the body
SOAPBody body = envelope.getBody();

// Create the main element and namespace
SOAPElement bodyElement = body.addChildElement(envelope.createName(
operation, "", "http://tempuri.org/"));
// Add parameters

bodyElement.addChildElement("mid").addTextNode("3");// 41221");

// envelope.getHeader().detachNode();
SOAPHeader header = envelope.getHeader(); // xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

// QName hName = envelope.createQName("Header", "");
// header.setElementQName(hName);

// Hearder - Authentication info
Name headerElementName = envelope.createName("AuthHeader", "",
"http://tempuri.org/");

SOAPHeaderElement headerElement = header
.addHeaderElement(headerElementName);
// headerElement.setMustUnderstand(false);
// headerElement.addNamespaceDeclaration("soap",
// "http://schemas.xmlsoap.org/soap/envelope/");
SOAPElement sessionId = headerElement.addChildElement("UID");
sessionId.addTextNode("380");

// Username Password

SOAPElement auth = headerElement.addChildElement("Authorization");
auth.addTextNode("Basic " + "UserIndustries:Authnet101");

// remove SOAPAction from HTTP Header
MimeHeaders mimeHeaders = message.getMimeHeaders();
mimeHeaders.addHeader("SOAPAction", "http://tempuri.org/"
+ operation);

// Save the message
message.saveChanges();

// Send the message and get the reply
SOAPMessage reply = connection.call(message, destination);

// remove soapAction from the header

// Retrieve the result - no error checking is done: BAD!
soapPart = reply.getSOAPPart();
envelope = soapPart.getEnvelope();
body = envelope.getBody();

Iterator iter = body.getChildElements();
Node resultOuter = ((Node) iter.next()).getFirstChild();
Node result = resultOuter.getFirstChild();

System.out.println("result : " + result.toString());
} catch (UnsupportedOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SOAPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

Wednesday, December 15, 2010

Profiling with YourKit

To install yourKit, download the bz2 and untar it -
tar xjvf yjp-9.0.7-linux.tar.bz2

If you want to profile a web application running on say Tomcat,
1. You should upload the yourkit to one of the accessible folders on the server.
2. your catalina.sh or setenv.sh should have:
# enable YourKit java profiling.
CATALINA_OPTS_YJP="-agentpath:/home/tom8080/yjp-9.0.9/bin/linux-x86-64/libyjpagent.so"
When you start the application, in the logs yjp will log a line saying on which port it is listening. Use that port when connecting from the local box UI.

Start the application

Connect and then start profiling. End and save to get the snapshot.

Friday, December 10, 2010

Cisco anyconnect vpn client on ubuntu 10

sudo apt-get install ia32-libs lib32nss-mdns libcurl3 libxml2
cd /usr/local
sudo mkdir firefox
cd firefox
sudo ln -s /usr/lib32/libnss3.so
sudo ln -s /usr/lib32/libplc4.so
sudo ln -s /usr/lib32/libnspr4.so
sudo ln -s /usr/lib32/libsmime3.so
sudo ln -s /usr/lib32/nss/libsoftokn3.so
sudo ldconfig

sudo sh ./vpn_install.sh

Wednesday, December 8, 2010

Adding new monitor resolution to Ubuntu

Follow these steps if your ubuntu monitor settings does not contain the resolution that your monitor supports.

Go to /etc/X11/
vi the file xorg.conf

my ubuntu did had the resolution - 1920x1080 so I had to add this file:

# xorg.conf (X.Org X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the xorg.conf manual page.
# (Type "man xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# Note that some configuration settings that could be done previously

# in this file, now are automatically configured by the server and settings
# here are ignored.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
# sudo dpkg-reconfigure -phigh xserver-xorg

Section "Monitor"
Identifier "Configured Monitor"
EndSection

Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
SubSection "Display"
Depth 24
Modes "1920x1080"
EndSubSection
EndSection

Section "Device"
Identifier "Configured Video Device"
EndSection


-- Installing Intel HD graphics card --
You need to install drivers for the graphics card. Here are the steps for Intel HD graphics card:
sudo add-apt-repository ppa:glasen/intel-driver
sudo apt-get update && sudo apt-get upgrade

-- Change grub ----
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
to
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i915.modeset=1"

in /etc/default/grub

run update-grub after making these changes & reboot.

-- run --
Run the below command:
cvt 1920 1080 60

This should output correct line to be used in xorg.conf
Here is the out put:
# 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz
Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync

$ xrandr --newmode "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync

$ xrandr --addmode VGA1 1920x1080_60.00

Wednesday, October 20, 2010

Thrift Installation

Thrift


Thrift is a framework for cross-language services development. It has less documentation and the documentation you will find is for implementing the services. Data is transferred over http in binary form. We can use the serialization it does for caching. So instead of passing it over the wire we will put the serialized data in our cachepage.
How Thrift works is :
Create thrift definition files.
Compile the files to get client and server codes.
Compiled code will have methods to get or set the serialized object.

Languages Supported


* C++
* C#
* Cocoa
* Erlang
* Haskell
* Java
* OCaml
* Perl
* PHP
* Python
* Ruby
* Smalltalk

Compare this with ProtocolBuffers, which supports : C++, Java, Python

You will find interesting comparison with protoBufs at this page : http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers


Serialization


Can serialize from and to binary or JSON . http://wiki.apache.org/thrift/ThriftUsageJava

Binary

TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory());
byte[] bytes = serializer.serialize(work);

TDeserializer deserializer = new TDeserializer(new TBinaryProtocol.Factory());
Work moreWork = new Work();
deserializer.deserialize(moreWork, bytes);


JSON

TSerializer serializer = new TSerializer(new TSimpleJSONProtocol.Factory());
String json = serializer.toString(work);


Thrift Definition File


Objects are defined as Structures.
Structure can contain other structures. - same as in Protocol Buffers
Can contain methods that act on the members
* Can import files.
* supports inheritance
For the above to work, compile using special option.
Here it the [http://wiki.apache.org/thrift/Tutorial tutorial]
You can find more examples in the test folder of downloaded tar.

Services


Thrift definition files can have services. The compiler generates client and server code that provides RPC.
This is how Thrift can be used with [http://cassandra.apache.org/ cassandra] and [http://www.lexemetech.com/2008/07/rpc-and-serialization-with-hadoop.html Haddop]

Development Support


* IDE :
Eclipse and IntelliJ plugins have been out. But not sure if they work. Here is the link for [http://sourceforge.net/projects/thrift4eclipse/ Eclipse] and [http://incubator.apache.org/thrift/version_control.html IntelliJ]
* Maven :
out of the box Thrift is supported by ant.
But [http://github.com/dtrott/maven-thrift-plugin maven] plugin is availabile

References


* [http://incubator.apache.org/thrift/ Main Page]
* [http://incubator.apache.org/thrift/static/thrift-20070401.pdf WhitePage]

Installation




Ubuntu
sudo apt-get install libboost-dev automake libtool flex bison pkg-config g++

1. Download Thrift tar ball
http://incubator.apache.org/thrift/download/


2. unzip to /url/local/thrift
unzip /home/asulgaonkar/download/thrift-0.5.0.tar.gz

3. go to the root and read README
follow the instructions and do :

./configure


4. go to lib/java

ant


This will create thrift jar.

5. create thrift compiler

cd compile/cpp
make


How to run the thrift compiler ?

6. Make sure thrift is compiled, both the compiler and the Java library. You should
be able to verify the following:

thrift/tutorial/java$ file ../../lib/java/libthrift.jar
../../lib/java/libthrift.jar: Zip archive data, at least v1.0 to extract


if not do step 4.


thrift/tutorial/java$ file ../../compiler/cpp/thrift
../../compiler/cpp/thrift: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

if not do step 5.


thrift/tutorial/java$ ls ../../lib/java/build/ivy/lib/
commons-lang-2.5.jar junit-4.4.jar servlet-api-2.5.jar slf4j-api-1.5.8.jar slf4j-simple-1.5.8.jar


7. Generate code for java:

thrift/tutorial/java$ cd ..
thrift/tutorial$ thrift -r -gen java tutorial.thrift


>> This will create gen-java
and folders inside it - shared and tutorial



8. Compile example

thrift/tutorial/java$ ant


This will compile the files that were generated


9. Run example:

thrift/tutorial/java$ ./JavaServer &
thrift/tutorial/java$ ./JavaClient




To prove that the serialization and de-serialization works
I modified client code to include following lines :


TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory());
byte[] bytes = serializer.serialize(work);
System.out.println("bytes : " + String.valueOf(bytes));
System.out.println("Serialization Works!!");

TDeserializer deserializer = new TDeserializer(new TBinaryProtocol.Factory());
deserializer.deserialize(moreWork, bytes);
System.out.println("De - Serialization Works!!" + moreWork.op + " on " + moreWork.num1 + " and " + moreWork.num2);

TSerializer jsonSerializer = new TSerializer(new TSimpleJSONProtocol.Factory());
String json = jsonSerializer.toString(moreWork);
System.out.println("JSON " + json);