tangyong / gf-cdi-osgi-integration

Glassfish CDI/OSGi Integration
2 stars 0 forks source link

making @Publish to support filter properties #3

Open tangyong opened 12 years ago

tangyong commented 12 years ago

Requirements:

[RFP146]CDI014 – The specification MUST provide a mechanism to specify additional OSGi service registration properties for CDI beans.

liking the following,

@Publish({ @Property(name="lang", value="EN"), @Property(name="country", value="US") }) @ApplicationScoped public class MyServiceImpl implements MyService { @Override public void doSomething() { } }

tangyong commented 12 years ago

Define @Propery and add it into @Publish annotation liking the following:

@Qualifier @Target({TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Publish {

Property[] value() default {};

/**
 * The rank of the service to find the best available service on lookups.
 *
 * @return the rank of the service. Default is 0.
 */
int rank() default 0;

}

Reference: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations

tangyong commented 12 years ago

By confirming, if defining @Property in @Publish Qualifier, WELD Container will report the following error,

org.jboss.weld.exceptions.IllegalArgumentException: WELD-001301 Annotation @org.glassfish.osgicdi.Publish(rank=0, value=[@org.glassfish.osgicdi.Property(name=country, value=CN)]) is not a qualifier at org.jboss.weld.resolution.ResolvableBuilder.checkQualifier(ResolvableBuilder.java:174) at org.jboss.weld.resolution.ResolvableBuilder.addQualifier(ResolvableBuilder.java:145) at org.jboss.weld.resolution.ResolvableBuilder.addQualifiers(ResolvableBuilder.java:167) at org.jboss.weld.manager.BeanManagerImpl.resolveDecorators(BeanManagerImpl.java:731) at org.jboss.weld.bean.AbstractClassBean.initDecorators(AbstractClassBean.java:315) at org.jboss.weld.bean.AbstractClassBean.initializeAfterBeanDiscovery(AbstractClassBean.java:307) at org.jboss.weld.bean.ManagedBean.initializeAfterBeanDiscovery(ManagedBean.java:361) at org.jboss.weld.bootstrap.BeanDeployment.doAfterBeanDiscovery(BeanDeployment.java:216) at org.jboss.weld.bootstrap.BeanDeployment.afterBeanDiscovery(BeanDeployment.java:208) at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:352) at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:190) at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128) at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:277) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:488) at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:418)

tangyong commented 12 years ago

So, I changed @Publish from Qualifier into plain Annotation, the above problem can be resolved.

tangyong commented 12 years ago

Now, the feature has been implemented.

[Using Way]

1 Service Publishing

@Publish({ @Property(name="country", value="CN") }) public class SimpleStockQuoteServiceImpl implements StockQuoteService ....

2 Service Consuming

@WebServlet(urlPatterns = "/list") public class StockQuoteServlet extends HttpServlet { //Inject the OSGi service by specifying the OSGiService qualifier @Inject @OSGiService(serviceCriteria="(country=CN)", dynamic = true, /* wait for 1 min _/ waitTimeout=30_1000) StockQuoteService sqs; .....

tangyong commented 12 years ago

also link to http://java.net/jira/browse/GLASSFISH-18972