Class loader classloader

Java class loader, classloader! Recent production deployment encountered class cast exception, might be due to class loader again.

I will update once verified. Java class loader, got to crack it.

And found myself too focus, tuned to get tired, make me tired to think. Note this!

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

Here is the exception encountered,which failed the deployment:

ClassCastException encountered during gcom v3 production release.

2012-06-09 05:08:20,659 INFO [main] spring.ServiceBean - Exposing service with name {http://www.bglobal.com/services/FASService}FASService
2012-06-09 05:08:20,669 INFO [main] ldap.LdapInstanceDescriptorPersistenceHelper - Services environment is OU=PROD
2012-06-09 05:08:20,672 WARN [main] ldap.LdapInstanceDescriptorPersistenceHelper - Could not configure the Realm
javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.jndi.dns.DnsContextFactory. Root exception is
java.lang.ClassCastException: com.sun.jndi.dns.DnsContextFactory cannot be cast to javax.naming.spi.InitialContextFactory
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:659)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:250)
at javax.naming.InitialContext.init(InitialContext.java:226)
at javax.naming.InitialContext.<init>(InitialContext.java:202)
at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:87)
at com.bglobal.reuse.serviceframework.directory.Realm.<init>(Realm.java:74)
at com.bglobal.reuse.serviceframework.discovery.ldap.LdapInstanceDescriptorPersistenceHelper.<init>(LdapInstanceDescriptorPersistenceHelper.java:131)
at com.bglobal.reuse.serviceframework.discovery.ldap.LdapInstanceDescriptorPersistenceHelper.<init>(LdapInstanceDescriptorPersistenceHelper.java:102)
at com.bglobal.reuse.serviceframework.discovery.DefaultServiceLocator.<init>(DefaultServiceLocator.java:27)
at com.bglobal.reuse.serviceframework.discovery.Registry.<init>(Registry.java:14)
at com.bglobal.reuse.xfire.extensions.server.listeners.ServiceRegistrationEventListener.getRegistry(ServiceRegistrationEventListener.java:174)
at com.bglobal.reuse.xfire.extensions.server.listeners.ServiceRegistrationEventListener.configureDiscovery(ServiceRegistrationEventListener.java:100)
at com.bglobal.reuse.xfire.extensions.server.listeners.ServiceRegistrationEventListener.endpointRegistered(ServiceRegistrationEventListener.java:53)
at org.codehaus.xfire.service.DefaultServiceRegistry.register(DefaultServiceRegistry.java:58)
at org.codehaus.xfire.spring.ServiceBean.afterPropertiesSet(ServiceBean.java:226)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4393)
at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
at $Proxy38.start(Unknown Source)
at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42)
at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37)
at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:286)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.system.ServiceController.doChange(ServiceController.java:688)
at org.jboss.system.ServiceController.start(ServiceController.java:460)
at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163)
at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99)
at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46)
at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:361)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.system.server.profileservice.repository.AbstractProfileService.activateProfile(AbstractProfileService.java:306)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:271)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461)
at org.jboss.Main.boot(Main.java:221)
at org.jboss.Main$1.run(Main.java:556)
at java.lang.Thread.run(Thread.java:619) 

Reason for this:
Team member put some redundant library in the package, which cause diffferent class loader for duplicated class, ultimately caused this ClassCast Exception, which failed the deployment.

      <dependency>
           <groupId>com.ibm.mq</groupId>
           <artifactId>jndi</artifactId>
           <version>${mq.version}</version>
       </dependency>
       <dependency>
           <groupId>com.ibm.mq</groupId>
           <artifactId>jta</artifactId>
           <version>${mq.version}</version>
       </dependency>
       <dependency>
           <groupId>com.ibm.mq</groupId>
           <artifactId>ldap</artifactId>
           <version>${mq.version}</version>
       </dependency>
       <dependency>
           <groupId>com.ibm.mq</groupId>
           <artifactId>postcard</artifactId>
           <version>${mq.version}</version>
       </dependency>
       <dependency>
           <groupId>com.ibm.mq</groupId>
           <artifactId>providerutil</artifactId>
           <version>${mq.version}</version>
       </dependency>
       <dependency>
           <groupId>com.ibm.mq</groupId>
           <artifactId>rmm</artifactId>
           <version>${mq.version}</version>
       </dependency> 

The duplicate javax.naming.spi.InitialContextFactory is also in this library, which could caused different classloader for two same class.

      <dependency>
           <groupId>com.ibm.mq</groupId>
           <artifactId>jndi</artifactId>
           <version>${mq.version}</version>
       </dependency>

Readings:
https://community.jboss.org/wiki/JBossClassLoaderIntroduction

http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/Class_Loading_and_Types_in_Java-ClassCastExceptions___Im_Not_Your_Type.html

Java Date timezone conversion

First method to convert from Date to UTC string

  private String dateToUtcString(Date convert){
	    Calendar now = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
	    now.setTime(convert);
	    try {
	      return DatatypeFactory.newInstance().newXMLGregorianCalendar((GregorianCalendar) now).toString();
	    } catch (DatatypeConfigurationException e) {
	      throw new RuntimeException(e);
	    }
	  }

Second method assume/force set passed in date as UTC, then convert to PST timezone

private String dateToPstString(Date convert) {
		String value = convert.toString();

		DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		df1.setTimeZone(TimeZone.getTimeZone("UTC"));

		// Parses the value and assumes it represents a date and time in the EST
		// timezone
		try {
			Date utcDate = df1.parse(value);// database result is UTC time
			Calendar pstDate = Calendar.getInstance(TimeZone
					.getTimeZone("GMT-8:00"));// always -8, as CART hardcoded
												// +17
			pstDate.setTime(utcDate);

			return DatatypeFactory.newInstance()
					.newXMLGregorianCalendar((GregorianCalendar) pstDate)
					.toString();
		} catch (DatatypeConfigurationException e) {
			throw new RuntimeException(e);

		} catch (ParseException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		return value;
	}