From 15f0e40e3893b4ac5208385cd1250a7a236ab7a1 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Sat, 12 Jul 2008 23:16:30 +0000 Subject: [PATCH] Flow resource loader fix for classpath resources --- .../model/FlowRelativeResourceLoader.java | 60 +++++++++++++++++++ .../builder/model/SubflowExpression.java | 49 +++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/FlowRelativeResourceLoader.java create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/SubflowExpression.java diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/FlowRelativeResourceLoader.java b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/FlowRelativeResourceLoader.java new file mode 100644 index 00000000..9714a344 --- /dev/null +++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/FlowRelativeResourceLoader.java @@ -0,0 +1,60 @@ +/* + * Copyright 2004-2007 the original author or authors. + * + * 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.springframework.webflow.engine.builder.model; + +import java.io.IOException; + +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; + +/** + * A resource loader that loads other resources relative to a Flow definition resource. Allows for easy loading of + * flow-relative resources using the standard {@link ResourceLoader} interface. + * + * @author Keith Donald + */ +class FlowRelativeResourceLoader implements ResourceLoader { + + private Resource flowResource; + + public FlowRelativeResourceLoader(Resource resource) { + this.flowResource = resource; + } + + public ClassLoader getClassLoader() { + return flowResource.getClass().getClassLoader(); + } + + public Resource getResource(String location) { + if (location.startsWith(CLASSPATH_URL_PREFIX)) { + return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader()); + } else { + return createFlowRelativeResource(location); + } + } + + private Resource createFlowRelativeResource(String location) { + try { + return flowResource.createRelative(location); + } catch (IOException e) { + IllegalArgumentException iae = new IllegalArgumentException( + "Unable to access a flow relative resource at location '" + location + "'"); + iae.initCause(e); + throw iae; + } + } +} \ No newline at end of file diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/SubflowExpression.java b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/SubflowExpression.java new file mode 100644 index 00000000..a0d1d2ac --- /dev/null +++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/model/SubflowExpression.java @@ -0,0 +1,49 @@ +/* + * Copyright 2004-2007 the original author or authors. + * + * 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.springframework.webflow.engine.builder.model; + +import org.springframework.binding.expression.EvaluationException; +import org.springframework.binding.expression.Expression; +import org.springframework.webflow.definition.registry.FlowDefinitionLocator; + +class SubflowExpression implements Expression { + + private Expression subflowId; + + private FlowDefinitionLocator flowDefinitionLocator; + + public SubflowExpression(Expression subflowId, FlowDefinitionLocator flowDefinitionLocator) { + this.subflowId = subflowId; + this.flowDefinitionLocator = flowDefinitionLocator; + } + + public Object getValue(Object context) throws EvaluationException { + String subflowId = (String) this.subflowId.getValue(context); + return flowDefinitionLocator.getFlowDefinition(subflowId); + } + + public void setValue(Object context, Object value) throws EvaluationException { + throw new UnsupportedOperationException("Cannot set a subflow expression"); + } + + public Class getValueType(Object context) { + return null; + } + + public String getExpressionString() { + return null; + } +} \ No newline at end of file