[weld-commits] Weld SVN: r5090 - doc/trunk/reference/en-US.
weld-commits at lists.jboss.org
weld-commits at lists.jboss.org
Tue Nov 17 12:14:26 EST 2009
Author: gavin.king at jboss.com
Date: 2009-11-17 12:14:26 -0500 (Tue, 17 Nov 2009)
New Revision: 5090
Modified:
doc/trunk/reference/en-US/extend.xml
Log:
example
Modified: doc/trunk/reference/en-US/extend.xml
===================================================================
--- doc/trunk/reference/en-US/extend.xml 2009-11-17 09:40:06 UTC (rev 5089)
+++ doc/trunk/reference/en-US/extend.xml 2009-11-17 17:14:26 UTC (rev 5090)
@@ -568,34 +568,113 @@
to intercept any of these operations when they are invoked by the container.
</para>
- <programlisting role="JAVA"><![CDATA[class LogServletCreationExtension implements Extension {
+ <para>
+ Here's a CDI portable extension that reads values from properties files and configures fields of Java EE components,
+ including servlets, EJBs, managed beans, interceptors and more. In this example, properties for a class such as
+ <literal>org.mydomain.blog.Blogger</literal> go in a resource named <literal>org/mydomain/blog/Blogger.properties</literal>,
+ and the name of a property must match the name of the field to be configured. So <literal>Blogger.properties</literal>
+ could contain:
+ </para>
+
+ <programlisting>firstName=Gavin
+lastName=King</programlisting>
+
+ <para>The portable extension works by wrapping the containers <literal>InjectionTarget</literal> and setting field
+ values from the <literal>inject()</literal> method.</para>
- <T extends Servlet> void processServlet(ProcessInjectionTarget<T> pit) {
-
- //wrap this to intercept the component lifecycle
- final InjectionTarget<T> it = pit.getInjectionTarget();
-
- InjectionTarget<T> wrapped = new InjectionTarget<T>() {
-
- @Override
- public T produce(CreationalContext<T> ctx) {
- Logger.global.debug("instantiating a servlet");
- return it.produce(ctx);
- }
-
- @Override
- public void inject(T instance, CreationalContext<T> ctx) {
- Logger.global.debug("injecting servlet dependencies");
- it.inject(instance, ctx);
- }
-
- //remaining methods of InjectionTarget
- ...
- }
-
- pit.setInjectionTarget(wrapped);
- }
-
+ <programlisting role="JAVA"><![CDATA[public class ConfigExtension implements Extension {
+
+ <X> void processInjectionTarget(ProcessInjectionTarget<X> pit) {
+
+ //wrap this to intercept the component lifecycle
+ final InjectionTarget<X> it = pit.getInjectionTarget();
+
+ final Map<Field, Object> configuredValues = new HashMap<Field, Object>();
+
+ //use this to read annotations of the class and its members
+ AnnotatedType<X> at = pit.getAnnotatedType();
+
+ //read the properties file
+ String propsFileName = at.getClass().getSimpleName() + ".properties";
+ InputStream stream = at.getJavaClass().getResourceAsStream(propsFileName);
+ if (stream!=null) {
+
+ try {
+ Properties props = new Properties();
+ props.load(stream);
+ for (Map.Entry<Object, Object> property : props.entrySet()) {
+ String fieldName = property.getKey().toString();
+ Object value = property.getValue();
+ try {
+ Field field = at.getJavaClass().getField(fieldName);
+ field.setAccessible(true);
+ if ( field.getType().isAssignableFrom( value.getClass() ) ) {
+ configuredValues.put(field, value);
+ }
+ else {
+ //TODO: do type conversion automatically
+ pit.addDefinitionError( new InjectionException(
+ "field is not of type String: " + field ) );
+ }
+ }
+ catch (NoSuchFieldException nsfe) {
+ pit.addDefinitionError(nsfe);
+ }
+ }
+ }
+ catch (IOException ioe) {
+ pit.addDefinitionError(ioe);
+ }
+ }
+
+ InjectionTarget<X> wrapped = new InjectionTarget<X>() {
+
+ @Override
+ public void inject(X instance, CreationalContext<X> ctx) {
+ it.inject(instance, ctx);
+
+ //set the values onto the new instance of the component
+ for (Map.Entry<Field, Object> configuredValue: configuredValues.entrySet()) {
+ try {
+ configuredValue.getKey().set(instance, configuredValue.getValue());
+ }
+ catch (Exception e) {
+ throw new InjectionException(e);
+ }
+ }
+ }
+
+ @Override
+ public void postConstruct(X instance) {
+ it.postConstruct(instance);
+ }
+
+ @Override
+ public void preDestroy(X instance) {
+ it.dispose(instance);
+ }
+
+ @Override
+ public void dispose(X instance) {
+ it.dispose(instance);
+ }
+
+ @Override
+ public Set<InjectionPoint> getInjectionPoints() {
+ return it.getInjectionPoints();
+ }
+
+ @Override
+ public X produce(CreationalContext<X> ctx) {
+ return it.produce(ctx);
+ }
+
+ };
+
+ pit.setInjectionTarget(wrapped);
+
+ }
+
}]]></programlisting>
<para>
More information about the weld-commits
mailing list