Friday, May 8, 2009


Anosh Sulgaonkar



425-687-6939 

 

Summary : 

IT Professional passionate for quality. Working in technical field for past 20 years in various positions such as Senior Developer, Team Lead, free lance developer. Taken part in Analysis, Implementation of various corporate IT initiatives. Promotes agile methodologies like Scrum and XP.

 

Skills:































Java / J2EE :   Servlets, EJB, JMS, JCA, socket programming, swing
MVC Spring MVC, Spring Webflow, JSP, Struts, Synapse (like Velocity)
IOC / ORM Spring, Hibernate (with and without annotations)
Build and CI Tools Ant, Ivy, Maven, Cruise control, Hudson.
Testing  JUnit, JMeter, Selenium RC, STIQ (Story test IQ)
UI & Frameworks HTML, CSS, SWING, ColdFusion, Flex, Silverlight,  JQuery
Servers Weblogic, JBoss, Tomcat
OS Unix (Solaris), Linux, Windows.
Working Knowledge  Ruby on Rails, Groovy and Grails, C#, Objective C.

 

 

Education:
Masters Degree in Electronics Engineering. (Walchand College of Engg., Sangli. India)
Bachelors Degree in Electrical Engineering. (Walchand College of Engg., Sangli. India)
Scrum Master Certification.
Ruby on Rails course at University of Washington 
 


Experience:
SolutionsIQ : April 2006 to Present.
SolutionsIQ is a leading IT service provider company that promotes agile methodology.
I got to work on various projects in roles such as Team lead and SDE.

Below are some of the projects I worked on:

 

Equipment Installment Plan for a cellular company.

Duration : Feb 2009 to Present 

The web hosted tool allowed the client company to sell their products on easy installments. At the point of sale, the webservice provided with the credit limit for the customer, On purchase it will keep track of the montly payments synchronizing with the accounting system and billing system.

Technology Used : Spring 2.5, Hibernate 3 with annotations, Spring MVC, Objective C

Role : SDE.

 

Voip setup website:

Duration : Feb 2008 to Feb 2009

Our team was responsible in building website for setting up voip for the new customer. Our tasks involved building mechanism for getting the phone numbers from phone service company, building website for letting the customer to activate the phone using webservices to voip service providers, e911 information, address etc.

This project used Scrum methodology.

Technology Used : Spring 2.0, Hibernate, Spring MVC, Spring Webflow, CXF, Selenium RC, STIQ.

Role : SDE

 

Customer Accounts Management for Cellular company.

Duration : Feb 2007 to Feb 2008

Technology Used : Struts.

 

Work Order System for Cellular Company

Duration April 2006 to Feb 2007

Enhance work order system for performance and maintainability.

Technology Used : Coldfusion, JSP, Java servelets.

Role : Team Lead

 


Zones Inc.
Team Lead. MIS, WebDev Group.

Duration: May 2000 to April 2006.
Zones Inc is a retailer of IT products.



EAI implementation:
Duration: 2003 September to April 2006.
Role : Lead.
This initiative was to build web based system that was connected to ERP, CRM and content system and present to the user a unified view.


Technology Used : JBoss, EJB 2, JCA, JMS, Sockets, FLEX.


 


B2B Web site:
Duration : 2000 May to 2003 December
Role : Sr Java Developer.
Technology Used: Java, Synapse(proprietary MVC like Velocity)


 



Product Maintenance tool:
Duration: May 2002 to August 2002.
Technology Used: Java, Swing


 


Customer Management Reports:
Duration : 2006 January to 2006 February
Technology Used: Java, iText, JFreeReport.


 


Independant Software Developer.


Duration : 1995 to 2000
Developed payrole system for textile mills.


Technology Used: FoxPro, VB 5


 


Assitant Professor in Electronics Engg. at Walchand Institute of Technology, India.


Duration : 1990 January to 1999 February
Lecturer on subjects like : programming languages, Computer Graphics, Electronic System Design, ElectroMagnetic Engg., Analog Devices etc. Did research on Computer aided Textile designing. 


Technology Used: C, ASM86



Immigration Status: Permanent Resident (Green Card Holder).


 


Referrals:


Please refer to LinkedIn page:
 http://www.linkedin.com/in/anoshsulgaonkar


 

 

 

 

Wednesday, April 8, 2009

Attaching detached objects

Iam reading a list and processing each element.
For example I get list of Memberships. Each Membership has a user. Each User has an Address.
If I get list of Memberships in one session. Then try to access address from the user in another session we will get the famous 'no session exception'
We need to attach the user created in the first session to the second one.

session2.update(user);
system.out.printf("user City :"+ user.address().getCity);
so session1 creates memberships.
user.address is invoked by session2.
before we invoke the command, we need to attach user to the session2.
session2.update(user) will do the trick.

Friday, April 3, 2009

Hibernate Transactions with Annotations

The current session is maintained in the SessionFactory throughout the call if it has the @Transactional annotation.

Here are the steps for setting the Transactions

Pass the sessionFactory to the transactionManager.

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>


Add the tx namespace to context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

.
.
.

<tx:annotation-driven />


Place the annotations above the methods you are going to use the sessionFactory.

@Transactional
public Product getProductById(final long id) {
final Session session = sessionFactory.getCurrentSession();
final Product product = (Product) session.get(Product.class, id);
return product;
}



Here are some points to remember:
1. If you want a method to be transactional.
2. The classes that use transactional annotation should use not use constructor autowire. - It will give bean creation exceptions. I have used setter injection autowire byType.
3. If a class is calling a method that needs transaction, The public method needs to be transactional. So you cannot call from outside, a non-transactional public method and then delegate to a transactional method.
4. How do you check if the hibernate transactions are working?
Insert in the method : sessionFactory.getCurrentSession()
If the transactions are not set correctly, you will get errors.
5. If the transaction is going to run a batch job, flush and clear the session at batches of 20 - 30.


final Session session = sessionFactory.getCurrentSession();
int count = 0;
for (final EipCharge charge : eipCharges) {
// Do the stuff .....
.....
if (count % 20 == 0) {
session.flush();
session.clear();
}
count++;
}

Monday, March 9, 2009

Quartz Implementation

1. Implent the batch job you need to run as the class that extends the class: QuartzJobBean implements StatefulJob.
This should override the method executeInternal. This should contain the stuff you need to cron.
2. Define the bean : org.springframework.scheduling.quartz.JobDetailBean
set the property ''jobClass' which it your implementation of cron that you want to run
3. Point the above bean to org.springframework.scheduling.quartz.CronTriggerBean
as the property jobDetail.
Another parameter it takes is the cron string. This is similar to unix cron
4.Place the above bean in the org.springframework.scheduling.quartz.SchedulerFactoryBean.
as content of the property 'trigger'


<bean name="helloWorld" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.test.eip.viva.batch.HelloWorld" />
</bean>
<bean id="helloWorldBatchTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="helloWorld" />
<property name="cronExpression" value="0 * * * * ?" />
</bean>
<bean id="eipSchedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="helloWorldBatchTrigger" />
</list>
</property>
</bean>




If your cron bean requires additional beans. This is the way to inject the bean. Provide the beans required by the jobClass in a jobDataAsMap property

<bean name="helloWorld" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.test.eip.viva.batch.HelloWorld" />
<property name="jobDataAsMap">
<map>
<entry key="message">
<ref bean="messageProvider" />
</entry>
</map>
</property>
</bean>

Tuesday, March 3, 2009

Contextual sessions with Hibernate3 and Spring2.5

DataSource and SessionFactory
The blog describes how to effectively use hibernate 3 with spring2.5 without using hibernateTemplate or HibernateDaoSupport.
Blog will walk you through setting up spring and hibernate. Using SessionFactory and session to access tables. Then it will show you how to use contextual sessions.
You need to start with a spring project. Create a Spring context.xml
Below is the header:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">


Create session factory

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.provider_configuration">classpath:/ehcache.cfg.xml</prop>
<prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
</props>
</property>
</bean>


Create DataSource:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
<property name="url">
<value>${db-url}</value>
</property>
<property name="username"><value>${db-username}</value></property>
<property name="password"><value>${db-password}</value></property>
</bean>


Using Properties File
The properties db-url, db-username, db-password are in the app.properties file. Spring will be able to read them using PropertyPlaceholderConfigurer which takes the location propety. Below is the bean definition in spring context:

<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:/app.properties</value>
</property>
</bean>


Using JNDI
You can use Jndi instead of maintaining the connection properties. Define dataSource as a JndiObjectFactoryBean instead of DriverManagerDataSource.

<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${datasource.jndi.name}" />
<property name="jndiEnvironment">
<props>
<prop key="java.naming.provider.url">${provider.url}</prop>
</props>
</property>
</bean>

Why JNDI?
1. Database url, username is not hard coaded inside in the war, so easy for deployment. Set up jndi on realted environment.
2. Connection pool size is managed by the jndi provider. If we are using DriverManager, it will allow you to create as many connections limited at the database. With Jndi provider, it is easy to figure out sessions left open.



Hibernate Configuration and Bean Annotations
Create hibernate configuration file under 'war/WEB-INF/classes/'. This file points to the beans that will be mapped to the tables.

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="com.test.eip.domain.ExampleBean1" />
<mapping class="com.test.eip.domain.ExampleBean2" />
</session-factory>
</hibernate-configuration>


The beans will be mapped to the tables using annotations from package 'javax.persistence.'
The annotations at the begining of the class : @Entity @Table(name='MyEntity' schema='')
Fields are mapped by the @Column(name='') annotations at the getters or at the field declarations.

@Entity
@Table(name = “ExampleBean1″, schema = “”)
public class Equipment implements java.io.Serializable {
private static final long serialVersionUID = 2959455667770311499L;
private long id;
@Id
@Column(name = “ID”, unique = true, nullable = false, precision = 38, scale = 0)
public long getId() {
return id;
}

With above 3 things, you should be able to get the entity from Database using command like session.get(MyEntity.class, id)

Using the SessionFactory
Below is the sample to get the Objects.

final Session session = sessionFactory.openSession();
try{
Equipment equipment = (Equipment) session.get(Equipment.class, id);
.
.
}finally{
session.close();
}


Below is the sample to execute the raw SQL

final Session currentSession = sessionFactory.openSession();
final Query query = currentSession.createSQLQuery("select ID_SEQ.nextval from dual");
try{
final String id = query.uniqueResult()).toPlainString();
}finally{
currentSession.close();
}


Contextual Sessions
You can use contextual sessions with sessionFactory.getCurrentSession(). For this you will have to define transactionManger.

Pass the sessionFactory to the transactionManager.

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>


Add the tx namespace to context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

.
.
.

<tx:annotation-driven />


Place the annotations above the methods you are going to use the sessionFactory.

@Transactional
public Equipment getEquipmentById(final long id) {
final Session session = sessionFactory.getCurrentSession();
final Equipment equipment = (Equipment) session.get(Equipment.class, id);
return equipment;
}

You no longer need to close the session or open the session with SessionFactory. getCurrentSession will check if there is an active session and return it. If there is no active session it will create new.
If the method in transaction calls other methods that use sessionFactory, all will use the same transaction provided you have '@Transaction' annotation over all the methods called. Same hibernate session will be kept alive for you by the SessionFactory.