2 * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org
.argeo
.slc
.core
.execution
;
19 import java
.util
.ArrayList
;
20 import java
.util
.HashMap
;
21 import java
.util
.List
;
23 import java
.util
.UUID
;
25 import org
.apache
.commons
.logging
.Log
;
26 import org
.apache
.commons
.logging
.LogFactory
;
27 import org
.argeo
.slc
.execution
.ExecutionSpec
;
28 import org
.argeo
.slc
.execution
.ExecutionSpecAttribute
;
29 import org
.springframework
.beans
.factory
.BeanNameAware
;
30 import org
.springframework
.beans
.factory
.InitializingBean
;
31 import org
.springframework
.beans
.factory
.NoSuchBeanDefinitionException
;
32 import org
.springframework
.beans
.factory
.config
.BeanDefinition
;
33 import org
.springframework
.beans
.factory
.config
.ConfigurableListableBeanFactory
;
34 import org
.springframework
.context
.ApplicationContext
;
35 import org
.springframework
.context
.ApplicationContextAware
;
36 import org
.springframework
.context
.ConfigurableApplicationContext
;
38 public class DefaultExecutionSpec
implements ExecutionSpec
, BeanNameAware
,
39 ApplicationContextAware
, InitializingBean
{
40 private final static Log log
= LogFactory
41 .getLog(DefaultExecutionSpec
.class);
42 private ApplicationContext applicationContext
;
44 private String description
;
45 private Map
<String
, ExecutionSpecAttribute
> attributes
= new HashMap
<String
, ExecutionSpecAttribute
>();
47 private String name
= getClass().getName() + "#" + UUID
.randomUUID();
49 public Map
<String
, ExecutionSpecAttribute
> getAttributes() {
53 public void setAttributes(Map
<String
, ExecutionSpecAttribute
> attributes
) {
54 this.attributes
= attributes
;
57 public void setBeanName(String name
) {
61 public String
getName() {
65 public boolean equals(Object obj
) {
66 return ((ExecutionSpec
) obj
).getName().equals(name
);
69 public String
getDescription() {
73 private ConfigurableListableBeanFactory
getBeanFactory() {
74 return ((ConfigurableApplicationContext
) applicationContext
)
78 public void setApplicationContext(ApplicationContext applicationContext
) {
79 this.applicationContext
= applicationContext
;
82 public void afterPropertiesSet() throws Exception
{
83 if (description
== null) {
85 description
= getBeanFactory().getBeanDefinition(name
)
87 } catch (NoSuchBeanDefinitionException e
) {
92 for (String key
: attributes
.keySet()) {
93 ExecutionSpecAttribute attr
= attributes
.get(key
);
94 if (attr
instanceof RefSpecAttribute
) {
95 RefSpecAttribute rsa
= (RefSpecAttribute
) attr
;
96 if (rsa
.getChoices() == null) {
97 List
<RefValueChoice
> choices
= buildRefValueChoices(rsa
);
98 rsa
.setChoices(choices
);
100 if (log
.isTraceEnabled())
101 log
.debug("Spec attr " + key
+ " has "
102 + rsa
.getChoices().size() + " choices");
107 protected List
<RefValueChoice
> buildRefValueChoices(RefSpecAttribute rsa
) {
108 List
<RefValueChoice
> choices
= new ArrayList
<RefValueChoice
>();
109 if (applicationContext
== null) {
110 log
.warn("No application context declared,"
111 + " cannot scan ref value choices.");
115 for (String beanName
: getBeanFactory().getBeanNamesForType(
116 rsa
.getTargetClass(), true, false)) {
117 BeanDefinition bd
= getBeanFactory().getBeanDefinition(beanName
);
118 RefValueChoice choice
= new RefValueChoice();
119 choice
.setName(beanName
);
120 choice
.setDescription(bd
.getDescription());
121 if (log
.isTraceEnabled())
122 log
.debug("Found choice " + beanName
+ " for " + rsa
);