View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.flow.cdi;
20  
21  import java.util.ArrayList;
22  import java.util.List;
23  
24  import javax.enterprise.event.Observes;
25  import javax.enterprise.inject.spi.AnnotatedType;
26  import javax.enterprise.inject.spi.BeanManager;
27  import javax.enterprise.inject.spi.BeforeBeanDiscovery;
28  import javax.enterprise.inject.spi.Extension;
29  import javax.enterprise.inject.spi.ProcessProducer;
30  import javax.enterprise.inject.spi.Producer;
31  import javax.faces.flow.Flow;
32  import javax.faces.flow.builder.FlowDefinition;
33  
34  /**
35   * This extension is responsible of scan flow definitions through CDI. For example:
36   *
37   * <code>
38   * @Produces @FlowDefinition
39   * public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {...}
40   * </code>
41   *
42   * @author Leonardo Uribe
43   */
44  public class FlowBuilderCDIExtension implements Extension
45  {
46      private List<Producer<Flow>> flowProducers = new ArrayList<Producer<Flow>>();
47  
48      public List<Producer<Flow>> getFlowProducers()
49      {
50          return flowProducers;
51      }
52  
53      void beforeBeanDiscovery(
54          @Observes final BeforeBeanDiscovery event, BeanManager beanManager)
55      {
56          // Register FlowBuilderFactoryBean as a bean with CDI annotations, so the system
57          // can take it into account, and use it later when necessary.
58          AnnotatedType<FlowBuilderFactoryBean> flowDiscoveryHelper =
59                          beanManager.createAnnotatedType(FlowBuilderFactoryBean.class);
60          event.addAnnotatedType(flowDiscoveryHelper);
61      }
62  
63      /**
64       * Stores any producer method that is annotated with @FlowDefinition.
65       */
66      <T> void findFlowDefinition(@Observes ProcessProducer<T, Flow> processProducer)
67      {
68          if (processProducer.getAnnotatedMember().isAnnotationPresent(FlowDefinition.class))
69          {
70              flowProducers.add(processProducer.getProducer());
71          }
72      }
73  }