cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Angelo (Updated) (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (DOSGI-115) Use Spring DM and Eclipse Gemini Blueprint with DOSGi
Date Thu, 15 Mar 2012 10:31:37 GMT

     [ https://issues.apache.org/jira/browse/DOSGI-115?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Angelo updated DOSGI-115:
-------------------------

    Description: 
Today cxf-dosgi-ri-dsw-cxf supports only Spring DM. This goal of this issue is to modify cxf-dosgi-ri-dsw-cxf
to support both Spring DM and Eclipse Gemini Blueprint.
The idea is : 

* 1) cxf-dosgi-ri-dsw-cxf :remove Spring DM dependencies (don't use directly org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext
and org.springframework.osgi.context.BundleContextAware) in this project but use a commons
interface :

------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container;

import java.util.List;

import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;

/**
 * OSGi Spring container API.
 * 
 * @author Angelo Zerr <angelo.zerr@gmail.com>
 * 
 */
public interface OsgiSpringContainer {

	/**
	 * Publish the given springs files and returns the Spring
	 * {@link ApplicationContext}.
	 * 
	 * @param springIntentLocations
	 * @param bundleContext
	 * @return
	 */
	ApplicationContext publish(List<String> springIntentLocations,
			BundleContext bundleContext);

	/**
	 * Returns the {@link BundleContext} from the given Spring application
	 * context.
	 * 
	 * @param context
	 * @return
	 */
	BundleContext getBundleContext(ApplicationContext context);
}
------------------------------------------------------------------------

1.1) In the class OsgiUtils:

do like this:

------------------------------------------------------------------------
ApplicationContext ctx = OsgiSpringContainerProvider.getContainer().publish(springIntentLocations,
bundleContext);
------------------------------------------------------------------------

Instead of doing that: 

------------------------------------------------------------------------
//            
//            
//            OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(springIntentLocations
//                .toArray(new String[] {}));
//            ctx.setPublishContextAsService(false);
//            ctx.setBundleContext(bundleContext);
//            ctx.refresh();
------------------------------------------------------------------------

1.2) In the Activator class: 

Implements ApplicationContextAware (instead of BundleContextAware) : 
public class Activator implements ManagedService, ApplicationContextAware/*,BundleContextAware*/
{

and implements setApplicationContext liek this 

------------------------------------------------------------------------
public void setApplicationContext(ApplicationContext context)
			throws BeansException {
 bc = OsgiUtils.getBundleContext(context);
}
------------------------------------------------------------------------

where OsgiUtils.getBundleContext use the interface 

------------------------------------------------------------------------
public static BundleContext getBundleContext(ApplicationContext context) {
  return OsgiSpringContainerProvider.getContainer().getBundleContext(context);
}: 
------------------------------------------------------------------------

1.1) OsgiSpringContainerProvider:

The OsgiSpringContainerProvider use SPI ServiceRegistry to retrieves the implemententation
of OsgiSpringContainer  : 

------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container;

import java.util.Iterator;

import javax.imageio.spi.ServiceRegistry;

public class OsgiSpringContainerProvider {

	private static OsgiSpringContainer container;

	public static OsgiSpringContainer getContainer()
			throws OsgiSpringContainerNotFoundException {
		if (container == null) {
			container = getContainerFromFragment();
		}
		return container;
	}

	public static synchronized OsgiSpringContainer getContainerFromFragment()
			throws OsgiSpringContainerNotFoundException {

		if (container != null) {
			return container;
		}
		Iterator<OsgiSpringContainer> containers = ServiceRegistry
				.lookupProviders(OsgiSpringContainer.class,
						OsgiSpringContainerProvider.class.getClassLoader());
		while (containers.hasNext()) {
			return containers.next();
		}
		throw new OsgiSpringContainerNotFoundException();
	}
}
------------------------------------------------------------------------

2) cxf-dosgi-ri-dsw-cxf-gemini : new project which is a fragment linked to cxf-dosgi-ri-dsw-cxf
and register with SPI ServiceRegistry the Gemini BluePring implementation of OSgiSpringContainer
: 

------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container.geminiblueprint;

import java.util.List;

import org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer;
import org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext;
import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;

public class GeminiBlueprintContainer
		implements OsgiSpringContainer {

	public ApplicationContext publish(List<String> springIntentLocations,
			BundleContext bundleContext) {
		OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(
				springIntentLocations.toArray(new String[] {}));
		ctx.setPublishContextAsService(false);
		ctx.setBundleContext(bundleContext);
		ctx.refresh();
		return ctx;
	}
		
	public BundleContext getBundleContext(ApplicationContext context) {
		return ((OsgiBundleXmlApplicationContext)context).getBundleContext();
	}
}
------------------------------------------------------------------------

This implementation is registered in the file META-INF/services/org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer
: 

------------------------------------------------------------------------
org.apache.cxf.dosgi.dsw.container.geminiblueprint.GeminiBlueprintContainer
------------------------------------------------------------------------

This fragment has Eclipse Gemini Blueprint dependencies.

3) cxf-dosgi-ri-dsw-cxf-springdm: new project which is a fragment linked to cxf-dosgi-ri-dsw-cxf
and register with SPI ServiceRegistry the SppringDM implementation of OSgiSpringContainer
: 

------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container.springdm;

import java.util.List;

import org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer;
import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;
import org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext;

public class SpringDMContainer implements
		OsgiSpringContainer {

	
	public ApplicationContext publish(List<String> springIntentLocations,
			BundleContext bundleContext) {
		OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(
				springIntentLocations.toArray(new String[] {}));
		ctx.setPublishContextAsService(false);
		ctx.setBundleContext(bundleContext);
		ctx.refresh();
		return ctx;
	}
	
	public BundleContext getBundleContext(ApplicationContext context) {
		return ((OsgiBundleXmlApplicationContext)context).getBundleContext();
	}

}
------------------------------------------------------------------------

This implementation is registered in the file META-INF/services/org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer
: 

------------------------------------------------------------------------
org.apache.cxf.dosgi.dsw.container.springdm.SpringDMContainer
------------------------------------------------------------------------

This fragment has Spring DM dependencies.

4) Use cxf-dosgi-ri-dsw-cxf with Eclipse Gemini Blueprint

So to use cxf-dosgi-ri-dsw-cxf with Eclipse Gemini Blueprint, add in the OSGi container cxf-dosgi-ri-dsw-cxf+cxf-dosgi-ri-dsw-cxf-gemini

5) Use cxf-dosgi-ri-dsw-cxf with Spring DM 

So to use cxf-dosgi-ri-dsw-cxf with Spring DM, add in the OSGi container cxf-dosgi-ri-dsw-cxf+cxf-dosgi-ri-dsw-cxf-springdm

I don't know Gemini Aires, but if it is based on Spring, we could create a new fragment cxf-dosgi-ri-dsw-cxf-aires.

Hope you will like it this idea.

  was:
Today cxf-dosgi-ri-dsw-cxf supports only Spring DM. This goal of this issue is to modify cxf-dosgi-ri-dsw-cxf
to support both Spring DM and Eclipse Gemini Blueprint.
The idea is : 

* 1) cxf-dosgi-ri-dsw-cxf :remove Spring DM dependencies (don't use directly org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext
and org.springframework.osgi.context.BundleContextAware) in this project but use a commons
interface :

------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container;

import java.util.List;

import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;

/**
 * OSGi Spring container API.
 * 
 * @author Angelo Zerr <angelo.zerr@gmail.com>
 * 
 */
public interface OsgiSpringContainer {

	/**
	 * Publish the given springs files and returns the Spring
	 * {@link ApplicationContext}.
	 * 
	 * @param springIntentLocations
	 * @param bundleContext
	 * @return
	 */
	ApplicationContext publish(List<String> springIntentLocations,
			BundleContext bundleContext);

	/**
	 * Returns the {@link BundleContext} from the given Spring application
	 * context.
	 * 
	 * @param context
	 * @return
	 */
	BundleContext getBundleContext(ApplicationContext context);
}
------------------------------------------------------------------------

1.1) In the class OsgiUtils:

do like this:

------------------------------------------------------------------------
ApplicationContext ctx = OsgiSpringContainerProvider.getContainer().publish(springIntentLocations,
bundleContext);
------------------------------------------------------------------------

Instead of doing that: 

------------------------------------------------------------------------
//            
//            
//            OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(springIntentLocations
//                .toArray(new String[] {}));
//            ctx.setPublishContextAsService(false);
//            ctx.setBundleContext(bundleContext);
//            ctx.refresh();
------------------------------------------------------------------------

1.2) In the Activator class: 

Implements ApplicationContextAware (instead of BundleContextAware) : 
public class Activator implements ManagedService, ApplicationContextAware/*,BundleContextAware*/
{

and implements setApplicationContext liek this 

------------------------------------------------------------------------
public void setApplicationContext(ApplicationContext context)
			throws BeansException {
 bc = OsgiUtils.getBundleContext(context);
}
------------------------------------------------------------------------

where OsgiUtils.getBundleContext use the interface 

------------------------------------------------------------------------
public static BundleContext getBundleContext(ApplicationContext context) {
  return OsgiSpringContainerProvider.getContainer().getBundleContext(context);
}: 
------------------------------------------------------------------------

1.1) OsgiSpringContainerProvider:

The OsgiSpringContainerProvider use SPI ServiceRegistry to retrieves the implemententation
of OsgiSpringContainer  : 

------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container;

import java.util.Iterator;

import javax.imageio.spi.ServiceRegistry;

public class OsgiSpringContainerProvider {

	private static OsgiSpringContainer container;

	public static OsgiSpringContainer getContainer()
			throws OsgiSpringContainerNotFoundException {
		if (container == null) {
			container = getContainerFromFragment();
		}
		return container;
	}

	public static synchronized OsgiSpringContainer getContainerFromFragment()
			throws OsgiSpringContainerNotFoundException {

		if (container != null) {
			return container;
		}
		Iterator<OsgiSpringContainer> containers = ServiceRegistry
				.lookupProviders(OsgiSpringContainer.class,
						OsgiSpringContainerProvider.class.getClassLoader());
		while (containers.hasNext()) {
			return containers.next();
		}
		throw new OsgiSpringContainerNotFoundException();
	}
}
------------------------------------------------------------------------

2) cxf-dosgi-ri-dsw-cxf-gemini : new project which is a fragment linked to cxf-dosgi-ri-dsw-cxf
and register with SPI ServiceRegistry the Gemini BluePring implementation of OSgiSpringContainer
: 

------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container.geminiblueprint;

import java.util.List;

import org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer;
import org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext;
import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;

public class GeminiBlueprintContainer
		implements OsgiSpringContainer {

	public ApplicationContext publish(List<String> springIntentLocations,
			BundleContext bundleContext) {
		OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(
				springIntentLocations.toArray(new String[] {}));
		ctx.setPublishContextAsService(false);
		ctx.setBundleContext(bundleContext);
		ctx.refresh();
		return ctx;
	}
		
	public BundleContext getBundleContext(ApplicationContext context) {
		return ((OsgiBundleXmlApplicationContext)context).getBundleContext();
	}
}
------------------------------------------------------------------------

This implementation is registered in the file META-INF/services/org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer
: 

------------------------------------------------------------------------
org.apache.cxf.dosgi.dsw.container.geminiblueprint.GeminiBlueprintContainer
------------------------------------------------------------------------

This fragment has Eclipse Gemini Blueprint dependencies.

3) cxf-dosgi-ri-dsw-cxf-springdm: new project which is a fragment linked to cxf-dosgi-ri-dsw-cxf
and register with SPI ServiceRegistry the SppringDM implementation of OSgiSpringContainer
: 

------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container.springdm;

import java.util.List;

import org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer;
import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;
import org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext;

public class SpringDMContainer implements
		OsgiSpringContainer {

	
	public ApplicationContext publish(List<String> springIntentLocations,
			BundleContext bundleContext) {
		OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(
				springIntentLocations.toArray(new String[] {}));
		ctx.setPublishContextAsService(false);
		ctx.setBundleContext(bundleContext);
		ctx.refresh();
		return ctx;
	}
	
	public BundleContext getBundleContext(ApplicationContext context) {
		return ((OsgiBundleXmlApplicationContext)context).getBundleContext();
	}

}
------------------------------------------------------------------------

This implementation is registered in the file META-INF/services/org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer
: 

------------------------------------------------------------------------
org.apache.cxf.dosgi.dsw.container.springdm.SpringDMContainer
------------------------------------------------------------------------

This fragment has Spring DM dependencies.

4) Use cxf-dosgi-ri-dsw-cxf with Eclipse Gemini Blueprint

So to use cxf-dosgi-ri-dsw-cxf with Eclipse Gemini Blueprint, add in the OSGi container cxf-dosgi-ri-dsw-cxf+cxf-dosgi-ri-dsw-cxf-gemini

5) Use cxf-dosgi-ri-dsw-cxf with Spring DM 

So to use cxf-dosgi-ri-dsw-cxf with Spring DM, add in the OSGi container cxf-dosgi-ri-dsw-cxf+cxf-dosgi-ri-dsw-cxf-springdm

I don't Gemini Aires, but if it is based on Spring, we could create a new fragment cxf-dosgi-ri-dsw-cxf-aires.

Hope you will like it this idea.

    
> Use Spring DM and Eclipse Gemini Blueprint with DOSGi
> -----------------------------------------------------
>
>                 Key: DOSGI-115
>                 URL: https://issues.apache.org/jira/browse/DOSGI-115
>             Project: CXF Distributed OSGi
>          Issue Type: New Feature
>          Components: DSW
>    Affects Versions: 1.4
>         Environment: Developped in Windows OS
>            Reporter: Angelo
>              Labels: patch
>             Fix For: 1.4
>
>         Attachments: cxf-dosgi-ri-dsw-Eclipse Projects cxf with Spring DM+Eclipse Gemini
Blueprint.zip
>
>
> Today cxf-dosgi-ri-dsw-cxf supports only Spring DM. This goal of this issue is to modify
cxf-dosgi-ri-dsw-cxf to support both Spring DM and Eclipse Gemini Blueprint.
> The idea is : 
> * 1) cxf-dosgi-ri-dsw-cxf :remove Spring DM dependencies (don't use directly org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext
and org.springframework.osgi.context.BundleContextAware) in this project but use a commons
interface :
> ------------------------------------------------------------------------
> package org.apache.cxf.dosgi.dsw.container;
> import java.util.List;
> import org.osgi.framework.BundleContext;
> import org.springframework.context.ApplicationContext;
> /**
>  * OSGi Spring container API.
>  * 
>  * @author Angelo Zerr <angelo.zerr@gmail.com>
>  * 
>  */
> public interface OsgiSpringContainer {
> 	/**
> 	 * Publish the given springs files and returns the Spring
> 	 * {@link ApplicationContext}.
> 	 * 
> 	 * @param springIntentLocations
> 	 * @param bundleContext
> 	 * @return
> 	 */
> 	ApplicationContext publish(List<String> springIntentLocations,
> 			BundleContext bundleContext);
> 	/**
> 	 * Returns the {@link BundleContext} from the given Spring application
> 	 * context.
> 	 * 
> 	 * @param context
> 	 * @return
> 	 */
> 	BundleContext getBundleContext(ApplicationContext context);
> }
> ------------------------------------------------------------------------
> 1.1) In the class OsgiUtils:
> do like this:
> ------------------------------------------------------------------------
> ApplicationContext ctx = OsgiSpringContainerProvider.getContainer().publish(springIntentLocations,
bundleContext);
> ------------------------------------------------------------------------
> Instead of doing that: 
> ------------------------------------------------------------------------
> //            
> //            
> //            OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(springIntentLocations
> //                .toArray(new String[] {}));
> //            ctx.setPublishContextAsService(false);
> //            ctx.setBundleContext(bundleContext);
> //            ctx.refresh();
> ------------------------------------------------------------------------
> 1.2) In the Activator class: 
> Implements ApplicationContextAware (instead of BundleContextAware) : 
> public class Activator implements ManagedService, ApplicationContextAware/*,BundleContextAware*/
{
> and implements setApplicationContext liek this 
> ------------------------------------------------------------------------
> public void setApplicationContext(ApplicationContext context)
> 			throws BeansException {
>  bc = OsgiUtils.getBundleContext(context);
> }
> ------------------------------------------------------------------------
> where OsgiUtils.getBundleContext use the interface 
> ------------------------------------------------------------------------
> public static BundleContext getBundleContext(ApplicationContext context) {
>   return OsgiSpringContainerProvider.getContainer().getBundleContext(context);
> }: 
> ------------------------------------------------------------------------
> 1.1) OsgiSpringContainerProvider:
> The OsgiSpringContainerProvider use SPI ServiceRegistry to retrieves the implemententation
of OsgiSpringContainer  : 
> ------------------------------------------------------------------------
> package org.apache.cxf.dosgi.dsw.container;
> import java.util.Iterator;
> import javax.imageio.spi.ServiceRegistry;
> public class OsgiSpringContainerProvider {
> 	private static OsgiSpringContainer container;
> 	public static OsgiSpringContainer getContainer()
> 			throws OsgiSpringContainerNotFoundException {
> 		if (container == null) {
> 			container = getContainerFromFragment();
> 		}
> 		return container;
> 	}
> 	public static synchronized OsgiSpringContainer getContainerFromFragment()
> 			throws OsgiSpringContainerNotFoundException {
> 		if (container != null) {
> 			return container;
> 		}
> 		Iterator<OsgiSpringContainer> containers = ServiceRegistry
> 				.lookupProviders(OsgiSpringContainer.class,
> 						OsgiSpringContainerProvider.class.getClassLoader());
> 		while (containers.hasNext()) {
> 			return containers.next();
> 		}
> 		throw new OsgiSpringContainerNotFoundException();
> 	}
> }
> ------------------------------------------------------------------------
> 2) cxf-dosgi-ri-dsw-cxf-gemini : new project which is a fragment linked to cxf-dosgi-ri-dsw-cxf
and register with SPI ServiceRegistry the Gemini BluePring implementation of OSgiSpringContainer
: 
> ------------------------------------------------------------------------
> package org.apache.cxf.dosgi.dsw.container.geminiblueprint;
> import java.util.List;
> import org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer;
> import org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext;
> import org.osgi.framework.BundleContext;
> import org.springframework.context.ApplicationContext;
> public class GeminiBlueprintContainer
> 		implements OsgiSpringContainer {
> 	public ApplicationContext publish(List<String> springIntentLocations,
> 			BundleContext bundleContext) {
> 		OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(
> 				springIntentLocations.toArray(new String[] {}));
> 		ctx.setPublishContextAsService(false);
> 		ctx.setBundleContext(bundleContext);
> 		ctx.refresh();
> 		return ctx;
> 	}
> 		
> 	public BundleContext getBundleContext(ApplicationContext context) {
> 		return ((OsgiBundleXmlApplicationContext)context).getBundleContext();
> 	}
> }
> ------------------------------------------------------------------------
> This implementation is registered in the file META-INF/services/org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer
: 
> ------------------------------------------------------------------------
> org.apache.cxf.dosgi.dsw.container.geminiblueprint.GeminiBlueprintContainer
> ------------------------------------------------------------------------
> This fragment has Eclipse Gemini Blueprint dependencies.
> 3) cxf-dosgi-ri-dsw-cxf-springdm: new project which is a fragment linked to cxf-dosgi-ri-dsw-cxf
and register with SPI ServiceRegistry the SppringDM implementation of OSgiSpringContainer
: 
> ------------------------------------------------------------------------
> package org.apache.cxf.dosgi.dsw.container.springdm;
> import java.util.List;
> import org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer;
> import org.osgi.framework.BundleContext;
> import org.springframework.context.ApplicationContext;
> import org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext;
> public class SpringDMContainer implements
> 		OsgiSpringContainer {
> 	
> 	public ApplicationContext publish(List<String> springIntentLocations,
> 			BundleContext bundleContext) {
> 		OsgiBundleXmlApplicationContext ctx = new OsgiBundleXmlApplicationContext(
> 				springIntentLocations.toArray(new String[] {}));
> 		ctx.setPublishContextAsService(false);
> 		ctx.setBundleContext(bundleContext);
> 		ctx.refresh();
> 		return ctx;
> 	}
> 	
> 	public BundleContext getBundleContext(ApplicationContext context) {
> 		return ((OsgiBundleXmlApplicationContext)context).getBundleContext();
> 	}
> }
> ------------------------------------------------------------------------
> This implementation is registered in the file META-INF/services/org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer
: 
> ------------------------------------------------------------------------
> org.apache.cxf.dosgi.dsw.container.springdm.SpringDMContainer
> ------------------------------------------------------------------------
> This fragment has Spring DM dependencies.
> 4) Use cxf-dosgi-ri-dsw-cxf with Eclipse Gemini Blueprint
> So to use cxf-dosgi-ri-dsw-cxf with Eclipse Gemini Blueprint, add in the OSGi container
cxf-dosgi-ri-dsw-cxf+cxf-dosgi-ri-dsw-cxf-gemini
> 5) Use cxf-dosgi-ri-dsw-cxf with Spring DM 
> So to use cxf-dosgi-ri-dsw-cxf with Spring DM, add in the OSGi container cxf-dosgi-ri-dsw-cxf+cxf-dosgi-ri-dsw-cxf-springdm
> I don't know Gemini Aires, but if it is based on Spring, we could create a new fragment
cxf-dosgi-ri-dsw-cxf-aires.
> Hope you will like it this idea.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message