X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2FDefaultExecutionFlowDescriptorConverter.java;h=7dc8d00cb74b97009f3240ae9691e81a5bb513b0;hb=bfb5bb54702d2e706ab7a8b0bc4af94eada6e01c;hp=a692279b816eef47d409464ea3651055a14e4b5e;hpb=45c15cdf39b3c7a13bb9af729ec4a1e6941e33f0;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultExecutionFlowDescriptorConverter.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultExecutionFlowDescriptorConverter.java index a692279b8..7dc8d00cb 100644 --- a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultExecutionFlowDescriptorConverter.java +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultExecutionFlowDescriptorConverter.java @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2010 Mathieu Baudier + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.argeo.slc.core.execution; import java.util.Comparator; @@ -64,16 +80,48 @@ public class DefaultExecutionFlowDescriptorConverter implements convertedValues.put(key, primitiveValue.getValue()); } else if (value instanceof RefValue) { RefValue refValue = (RefValue) value; - - if (REF_VALUE_TYPE_BEAN_NAME.equals(refValue.getType())) { - String ref = refValue.getRef(); - if (ref != null && !ref.equals(REF_VALUE_INTERNAL)) { - Object obj = applicationContext.getBean(refValue - .getRef()); + String type = refValue.getType(); + if (REF_VALUE_TYPE_BEAN_NAME.equals(type)) { + // FIXME: UI should send all information about spec + // - targetClass + // - name + // String executionSpecName = executionSpec.getName(); + // ExecutionSpec localSpec = (ExecutionSpec) + // applicationContext + // .getBean(executionSpecName); + // RefSpecAttribute localAttr = (RefSpecAttribute) + // localSpec + // .getAttributes().get(key); + // Class targetClass = localAttr.getTargetClass(); + // + // String primitiveType = PrimitiveUtils + // .classAsType(targetClass); + String primitiveType = null; + if (primitiveType != null) { + // not active + String ref = refValue.getRef(); + Object obj = PrimitiveUtils.convert(primitiveType, + ref); convertedValues.put(key, obj); } else { - log.warn("Cannot interpret " + refValue); + String ref = refValue.getRef(); + if (ref != null && !ref.equals(REF_VALUE_INTERNAL)) { + Object obj = null; + if (applicationContext.containsBean(ref)) { + obj = applicationContext.getBean(ref); + } else { + // FIXME: hack in order to pass primitive + obj = ref; + } + convertedValues.put(key, obj); + } else { + log.warn("Cannot interpret " + refValue); + } } + } else if (PrimitiveUtils.typeAsClass(type) != null) { + String ref = refValue.getRef(); + Object obj = PrimitiveUtils.convert(type, ref); + convertedValues.put(key, obj); } else { throw new UnsupportedException("Ref value type", refValue.getType()); @@ -156,51 +204,71 @@ public class DefaultExecutionFlowDescriptorConverter implements protected RefValue buildRefValue(RefSpecAttribute rsa, ExecutionFlow executionFlow, String key) { RefValue refValue = new RefValue(); + // FIXME: UI should be able to deal with other types refValue.setType(REF_VALUE_TYPE_BEAN_NAME); + Class targetClass = rsa.getTargetClass(); + String primitiveType = PrimitiveUtils.classAsType(targetClass); + if (primitiveType != null) { + if (executionFlow.isSetAsParameter(key)) { + Object value = executionFlow.getParameter(key); + refValue.setRef(value.toString()); + } + refValue.setType(primitiveType); + return refValue; + } else { - if (executionFlow.isSetAsParameter(key)) { - String ref = null; - Object value = executionFlow.getParameter(key); - if (applicationContext == null) { - log - .warn("No application context declared, cannot scan ref value."); - ref = value.toString(); - } else { + if (executionFlow.isSetAsParameter(key)) { + String ref = null; + Object value = executionFlow.getParameter(key); + if (applicationContext == null) { + log + .warn("No application context declared, cannot scan ref value."); + ref = value.toString(); + } else { - // look for a ref to the value - Map beans = getBeanFactory().getBeansOfType( - rsa.getTargetClass(), false, false); - // TODO: also check scoped beans - beans: for (String beanName : beans.keySet()) { - Object obj = beans.get(beanName); - if (value instanceof ScopedObject) { - // don't call methods of the target of the scope - if (obj instanceof ScopedObject) - if (value == obj) { + // look for a ref to the value + Map beans = getBeanFactory() + .getBeansOfType(targetClass, false, false); + // TODO: also check scoped beans + beans: for (String beanName : beans.keySet()) { + Object obj = beans.get(beanName); + if (value instanceof ScopedObject) { + // don't call methods of the target of the scope + if (obj instanceof ScopedObject) + if (value == obj) { + ref = beanName; + break beans; + } + } else { + if (obj.equals(value)) { ref = beanName; break beans; } - } else { - if (obj.equals(value)) { - ref = beanName; - break beans; } } } + if (ref == null) { + log + .warn("Cannot define reference for ref spec attribute " + + key + + " in " + + executionFlow + + " (" + + rsa + + ")." + + " If it is an inner bean consider put it frozen."); + ref = REF_VALUE_INTERNAL; + } else { + if (log.isTraceEnabled()) + log.trace(ref + + " is the reference for ref spec attribute " + + key + " in " + executionFlow + " (" + rsa + + ")"); + } + refValue.setRef(ref); } - if (ref == null) { - log.warn("Cannot define reference for ref spec attribute " - + key + " in " + executionFlow + " (" + rsa + ")." - + " If it is an inner bean consider put it frozen."); - ref = REF_VALUE_INTERNAL; - } else { - if (log.isDebugEnabled()) - log.debug(ref + " is the reference for ref spec attribute " - + key + " in " + executionFlow + " (" + rsa + ")"); - } - refValue.setRef(ref); + return refValue; } - return refValue; } private ConfigurableListableBeanFactory getBeanFactory() {