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=f610cedea8fec0ad5d14d0bd842247ab246a3aec;hb=31a8055cac622a55afd2668e77f00aba1d031f91;hp=1ff50e0db9c0f1c7caf8d54f0993ba7458197798;hpb=006e9a660a4edb4b3815f5a96e4366f80dbcc3ea;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 1ff50e0db..f610cedea 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 @@ -46,7 +46,7 @@ public class DefaultExecutionFlowDescriptorConverter implements ExecutionSpec executionSpec = executionFlowDescriptor .getExecutionSpec(); - if (executionSpec == null) + if (executionSpec == null && log.isTraceEnabled()) log.warn("Execution spec is null for " + executionFlowDescriptor); if (values != null && executionSpec != null) { @@ -64,16 +64,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 +188,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.isDebugEnabled()) + log.debug(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() { @@ -218,9 +270,17 @@ public class DefaultExecutionFlowDescriptorConverter implements Comparator { public int compare(ExecutionFlowDescriptor o1, ExecutionFlowDescriptor o2) { + // TODO: write unit tests for this if (StringUtils.hasText(o1.getPath()) && StringUtils.hasText(o2.getPath())) { - return o1.getPath().compareTo(o2.getPath()); + if (o1.getPath().equals(o2.getPath())) + return o1.getName().compareTo(o2.getName()); + else if (o1.getPath().startsWith(o2.getPath())) + return -1; + else if (o2.getPath().startsWith(o1.getPath())) + return 1; + else + return o1.getPath().compareTo(o2.getPath()); } else if (!StringUtils.hasText(o1.getPath()) && StringUtils.hasText(o2.getPath())) { return 1;