diff --git a/spring-binding/src/main/java/org/springframework/binding/collection/SharedMap.java b/spring-binding/src/main/java/org/springframework/binding/collection/SharedMap.java
index 108bd0d7..a0660ba6 100644
--- a/spring-binding/src/main/java/org/springframework/binding/collection/SharedMap.java
+++ b/spring-binding/src/main/java/org/springframework/binding/collection/SharedMap.java
@@ -1,45 +1,45 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.binding.collection;
-
-import java.util.Map;
-
-/**
- * A simple subinterface of {@link Map} that exposes a mutex that application code can synchronize on.
- *
- * Expected to be implemented by Maps that are backed by shared objects that require synchronization between multiple
- * threads. An example would be the HTTP session map.
- *
- * @author Keith Donald
- */
-public interface SharedMap extends Map {
-
- /**
- * Returns the shared mutex that may be synchronized on using a synchronized block. The returned mutex is guaranteed
- * to be non-null.
- *
- * Example usage:
- *
- *
- * synchronized (sharedMap.getMutex()) {
- * // do synchronized work
- * }
- *
- *
- * @return the mutex
- */
- Object getMutex();
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.binding.collection;
+
+import java.util.Map;
+
+/**
+ * A simple subinterface of {@link Map} that exposes a mutex that application code can synchronize on.
+ *
+ * Expected to be implemented by Maps that are backed by shared objects that require synchronization between multiple
+ * threads. An example would be the HTTP session map.
+ *
+ * @author Keith Donald
+ */
+public interface SharedMap extends Map {
+
+ /**
+ * Returns the shared mutex that may be synchronized on using a synchronized block. The returned mutex is guaranteed
+ * to be non-null.
+ *
+ * Example usage:
+ *
+ *
+ * synchronized (sharedMap.getMutex()) {
+ * // do synchronized work
+ * }
+ *
+ *
+ * @return the mutex
+ */
+ Object getMutex();
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/collection/SharedMapDecorator.java b/spring-binding/src/main/java/org/springframework/binding/collection/SharedMapDecorator.java
index b0e084b1..dfae6881 100644
--- a/spring-binding/src/main/java/org/springframework/binding/collection/SharedMapDecorator.java
+++ b/spring-binding/src/main/java/org/springframework/binding/collection/SharedMapDecorator.java
@@ -1,105 +1,105 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.binding.collection;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import org.springframework.core.style.ToStringCreator;
-
-/**
- * A map decorator that implements SharedMap. By default, simply returns the map itself as the mutex.
- * Subclasses may override to return a different mutex object.
- *
- * @author Keith Donald
- */
-public class SharedMapDecorator implements SharedMap, Serializable {
-
- /**
- * The wrapped, target map.
- */
- private Map map;
-
- /**
- * Creates a new shared map decorator.
- * @param map the map that is shared by multiple threads, to be synced
- */
- public SharedMapDecorator(Map map) {
- this.map = map;
- }
-
- // implementing Map
-
- public void clear() {
- map.clear();
- }
-
- public boolean containsKey(Object key) {
- return map.containsKey(key);
- }
-
- public boolean containsValue(Object value) {
- return map.containsValue(value);
- }
-
- public Set> entrySet() {
- return map.entrySet();
- }
-
- public V get(Object key) {
- return map.get(key);
- }
-
- public boolean isEmpty() {
- return map.isEmpty();
- }
-
- public Set keySet() {
- return map.keySet();
- }
-
- public V put(K key, V value) {
- return map.put(key, value);
- }
-
- public void putAll(Map extends K, ? extends V> map) {
- this.map.putAll(map);
- }
-
- public V remove(Object key) {
- return map.remove(key);
- }
-
- public int size() {
- return map.size();
- }
-
- public Collection values() {
- return map.values();
- }
-
- // implementing SharedMap
-
- public Object getMutex() {
- return map;
- }
-
- public String toString() {
- return new ToStringCreator(this).append("map", map).append("mutex", getMutex()).toString();
- }
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.binding.collection;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+import org.springframework.core.style.ToStringCreator;
+
+/**
+ * A map decorator that implements SharedMap. By default, simply returns the map itself as the mutex.
+ * Subclasses may override to return a different mutex object.
+ *
+ * @author Keith Donald
+ */
+public class SharedMapDecorator implements SharedMap, Serializable {
+
+ /**
+ * The wrapped, target map.
+ */
+ private Map map;
+
+ /**
+ * Creates a new shared map decorator.
+ * @param map the map that is shared by multiple threads, to be synced
+ */
+ public SharedMapDecorator(Map map) {
+ this.map = map;
+ }
+
+ // implementing Map
+
+ public void clear() {
+ map.clear();
+ }
+
+ public boolean containsKey(Object key) {
+ return map.containsKey(key);
+ }
+
+ public boolean containsValue(Object value) {
+ return map.containsValue(value);
+ }
+
+ public Set> entrySet() {
+ return map.entrySet();
+ }
+
+ public V get(Object key) {
+ return map.get(key);
+ }
+
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+
+ public Set keySet() {
+ return map.keySet();
+ }
+
+ public V put(K key, V value) {
+ return map.put(key, value);
+ }
+
+ public void putAll(Map extends K, ? extends V> map) {
+ this.map.putAll(map);
+ }
+
+ public V remove(Object key) {
+ return map.remove(key);
+ }
+
+ public int size() {
+ return map.size();
+ }
+
+ public Collection values() {
+ return map.values();
+ }
+
+ // implementing SharedMap
+
+ public Object getMutex() {
+ return map;
+ }
+
+ public String toString() {
+ return new ToStringCreator(this).append("map", map).append("mutex", getMutex()).toString();
+ }
}
diff --git a/spring-binding/src/main/java/org/springframework/binding/collection/StringKeyedMapAdapter.java b/spring-binding/src/main/java/org/springframework/binding/collection/StringKeyedMapAdapter.java
index eb594e91..d11079c7 100644
--- a/spring-binding/src/main/java/org/springframework/binding/collection/StringKeyedMapAdapter.java
+++ b/spring-binding/src/main/java/org/springframework/binding/collection/StringKeyedMapAdapter.java
@@ -1,289 +1,289 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.binding.collection;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * Base class for map adapters whose keys are String values. Concrete classes need only implement the abstract hook
- * methods defined by this class.
- *
- * @author Keith Donald
- */
-public abstract class StringKeyedMapAdapter implements Map {
-
- private Set keySet;
-
- private Collection values;
-
- private Set> entrySet;
-
- // implementing Map
-
- public void clear() {
- for (Iterator it = getAttributeNames(); it.hasNext();) {
- removeAttribute(it.next());
- }
- }
-
- public boolean containsKey(Object key) {
- return getAttribute(key.toString()) != null;
- }
-
- public boolean containsValue(Object value) {
- if (value == null) {
- return false;
- }
- for (Iterator it = getAttributeNames(); it.hasNext();) {
- Object aValue = getAttribute(it.next());
- if (value.equals(aValue)) {
- return true;
- }
- }
- return false;
- }
-
- public Set> entrySet() {
- return (entrySet != null) ? entrySet : (entrySet = new EntrySet());
- }
-
- public V get(Object key) {
- return getAttribute(key.toString());
- }
-
- public boolean isEmpty() {
- return !getAttributeNames().hasNext();
- }
-
- public Set keySet() {
- return (keySet != null) ? keySet : (keySet = new KeySet());
- }
-
- public V put(String key, V value) {
- String stringKey = String.valueOf(key);
- V previousValue = getAttribute(stringKey);
- setAttribute(stringKey, value);
- return previousValue;
- }
-
- public void putAll(Map extends String, ? extends V> map) {
- for (Entry extends String, ? extends V> entry : map.entrySet()) {
- setAttribute(entry.getKey(), entry.getValue());
- }
- }
-
- public V remove(Object key) {
- String stringKey = key.toString();
- V retval = getAttribute(stringKey);
- removeAttribute(stringKey);
- return retval;
- }
-
- public int size() {
- int size = 0;
- for (Iterator it = getAttributeNames(); it.hasNext();) {
- size++;
- it.next();
- }
- return size;
- }
-
- public Collection values() {
- return (values != null) ? values : (values = new Values());
- }
-
- // hook methods
-
- /**
- * Hook method that needs to be implemented by concrete subclasses. Gets a value associated with a key.
- * @param key the key to lookup
- * @return the associated value, or null if none
- */
- protected abstract V getAttribute(String key);
-
- /**
- * Hook method that needs to be implemented by concrete subclasses. Puts a key-value pair in the map, overwriting
- * any possible earlier value associated with the same key.
- * @param key the key to associate the value with
- * @param value the value to associate with the key
- */
- protected abstract void setAttribute(String key, V value);
-
- /**
- * Hook method that needs to be implemented by concrete subclasses. Removes a key and its associated value from the
- * map.
- * @param key the key to remove
- */
- protected abstract void removeAttribute(String key);
-
- /**
- * Hook method that needs to be implemented by concrete subclasses. Returns an enumeration listing all keys known to
- * the map.
- * @return the key enumeration
- */
- protected abstract Iterator getAttributeNames();
-
- // internal helper classes
-
- private abstract class AbstractSet extends java.util.AbstractSet {
- public boolean isEmpty() {
- return StringKeyedMapAdapter.this.isEmpty();
- }
-
- public int size() {
- return StringKeyedMapAdapter.this.size();
- }
-
- public void clear() {
- StringKeyedMapAdapter.this.clear();
- }
- }
-
- private class KeySet extends AbstractSet {
- public Iterator iterator() {
- return new KeyIterator();
- }
-
- public boolean contains(Object o) {
- return StringKeyedMapAdapter.this.containsKey(o);
- }
-
- public boolean remove(Object o) {
- return StringKeyedMapAdapter.this.remove(o) != null;
- }
- }
-
- private abstract class AbstractKeyIterator {
- private final Iterator it = getAttributeNames();
-
- private String currentKey;
-
- public void remove() {
- if (currentKey == null) {
- throw new NoSuchElementException("You must call next() at least once");
- }
- StringKeyedMapAdapter.this.remove(currentKey);
- }
-
- public boolean hasNext() {
- return it.hasNext();
- }
-
- protected String nextKey() {
- return currentKey = it.next();
- }
- }
-
- private class KeyIterator extends AbstractKeyIterator implements Iterator {
- public String next() {
- return nextKey();
- }
- }
-
- private class Values extends AbstractSet {
- public Iterator iterator() {
- return new ValuesIterator();
- }
-
- public boolean contains(Object o) {
- return StringKeyedMapAdapter.this.containsValue(o);
- }
-
- public boolean remove(Object o) {
- if (o == null) {
- return false;
- }
- for (Iterator it = iterator(); it.hasNext();) {
- if (o.equals(it.next())) {
- it.remove();
- return true;
- }
- }
- return false;
- }
- }
-
- private class ValuesIterator extends AbstractKeyIterator implements Iterator {
- public V next() {
- return StringKeyedMapAdapter.this.get(nextKey());
- }
- }
-
- private class EntrySet extends AbstractSet> {
- public Iterator> iterator() {
- return new EntryIterator();
- }
-
- public boolean contains(Object o) {
- Entry entry = getAsEntry(o);
- if (entry == null || entry.getKey() == null || entry.getValue() == null) {
- return false;
- }
- V valueFromThisMap = StringKeyedMapAdapter.this.get(entry.getKey());
- return entry.getValue().equals(valueFromThisMap);
- }
-
- public boolean remove(Object o) {
- Entry entry = getAsEntry(o);
- if (entry == null || entry.getKey() == null || entry.getValue() == null) {
- return false;
- }
- V valueFromThisMap = StringKeyedMapAdapter.this.get(entry.getKey());
- if (!entry.getValue().equals(valueFromThisMap)) {
- return false;
- }
- return StringKeyedMapAdapter.this.remove(entry.getKey()) != null;
- }
-
- @SuppressWarnings("unchecked")
- private Entry getAsEntry(Object o) {
- if (o instanceof Entry) {
- return (Entry) o;
- }
- return null;
- }
- }
-
- private class EntryIterator extends AbstractKeyIterator implements Iterator> {
- public Entry next() {
- return new EntrySetEntry(nextKey());
- }
- }
-
- private class EntrySetEntry implements Entry {
- private final String currentKey;
-
- public EntrySetEntry(String currentKey) {
- this.currentKey = currentKey;
- }
-
- public String getKey() {
- return currentKey;
- }
-
- public V getValue() {
- return StringKeyedMapAdapter.this.get(currentKey);
- }
-
- public V setValue(V value) {
- return StringKeyedMapAdapter.this.put(currentKey, value);
- }
- }
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.binding.collection;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * Base class for map adapters whose keys are String values. Concrete classes need only implement the abstract hook
+ * methods defined by this class.
+ *
+ * @author Keith Donald
+ */
+public abstract class StringKeyedMapAdapter implements Map {
+
+ private Set keySet;
+
+ private Collection values;
+
+ private Set> entrySet;
+
+ // implementing Map
+
+ public void clear() {
+ for (Iterator it = getAttributeNames(); it.hasNext();) {
+ removeAttribute(it.next());
+ }
+ }
+
+ public boolean containsKey(Object key) {
+ return getAttribute(key.toString()) != null;
+ }
+
+ public boolean containsValue(Object value) {
+ if (value == null) {
+ return false;
+ }
+ for (Iterator it = getAttributeNames(); it.hasNext();) {
+ Object aValue = getAttribute(it.next());
+ if (value.equals(aValue)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Set> entrySet() {
+ return (entrySet != null) ? entrySet : (entrySet = new EntrySet());
+ }
+
+ public V get(Object key) {
+ return getAttribute(key.toString());
+ }
+
+ public boolean isEmpty() {
+ return !getAttributeNames().hasNext();
+ }
+
+ public Set keySet() {
+ return (keySet != null) ? keySet : (keySet = new KeySet());
+ }
+
+ public V put(String key, V value) {
+ String stringKey = String.valueOf(key);
+ V previousValue = getAttribute(stringKey);
+ setAttribute(stringKey, value);
+ return previousValue;
+ }
+
+ public void putAll(Map extends String, ? extends V> map) {
+ for (Entry extends String, ? extends V> entry : map.entrySet()) {
+ setAttribute(entry.getKey(), entry.getValue());
+ }
+ }
+
+ public V remove(Object key) {
+ String stringKey = key.toString();
+ V retval = getAttribute(stringKey);
+ removeAttribute(stringKey);
+ return retval;
+ }
+
+ public int size() {
+ int size = 0;
+ for (Iterator it = getAttributeNames(); it.hasNext();) {
+ size++;
+ it.next();
+ }
+ return size;
+ }
+
+ public Collection values() {
+ return (values != null) ? values : (values = new Values());
+ }
+
+ // hook methods
+
+ /**
+ * Hook method that needs to be implemented by concrete subclasses. Gets a value associated with a key.
+ * @param key the key to lookup
+ * @return the associated value, or null if none
+ */
+ protected abstract V getAttribute(String key);
+
+ /**
+ * Hook method that needs to be implemented by concrete subclasses. Puts a key-value pair in the map, overwriting
+ * any possible earlier value associated with the same key.
+ * @param key the key to associate the value with
+ * @param value the value to associate with the key
+ */
+ protected abstract void setAttribute(String key, V value);
+
+ /**
+ * Hook method that needs to be implemented by concrete subclasses. Removes a key and its associated value from the
+ * map.
+ * @param key the key to remove
+ */
+ protected abstract void removeAttribute(String key);
+
+ /**
+ * Hook method that needs to be implemented by concrete subclasses. Returns an enumeration listing all keys known to
+ * the map.
+ * @return the key enumeration
+ */
+ protected abstract Iterator getAttributeNames();
+
+ // internal helper classes
+
+ private abstract class AbstractSet extends java.util.AbstractSet {
+ public boolean isEmpty() {
+ return StringKeyedMapAdapter.this.isEmpty();
+ }
+
+ public int size() {
+ return StringKeyedMapAdapter.this.size();
+ }
+
+ public void clear() {
+ StringKeyedMapAdapter.this.clear();
+ }
+ }
+
+ private class KeySet extends AbstractSet {
+ public Iterator iterator() {
+ return new KeyIterator();
+ }
+
+ public boolean contains(Object o) {
+ return StringKeyedMapAdapter.this.containsKey(o);
+ }
+
+ public boolean remove(Object o) {
+ return StringKeyedMapAdapter.this.remove(o) != null;
+ }
+ }
+
+ private abstract class AbstractKeyIterator {
+ private final Iterator it = getAttributeNames();
+
+ private String currentKey;
+
+ public void remove() {
+ if (currentKey == null) {
+ throw new NoSuchElementException("You must call next() at least once");
+ }
+ StringKeyedMapAdapter.this.remove(currentKey);
+ }
+
+ public boolean hasNext() {
+ return it.hasNext();
+ }
+
+ protected String nextKey() {
+ return currentKey = it.next();
+ }
+ }
+
+ private class KeyIterator extends AbstractKeyIterator implements Iterator {
+ public String next() {
+ return nextKey();
+ }
+ }
+
+ private class Values extends AbstractSet {
+ public Iterator iterator() {
+ return new ValuesIterator();
+ }
+
+ public boolean contains(Object o) {
+ return StringKeyedMapAdapter.this.containsValue(o);
+ }
+
+ public boolean remove(Object o) {
+ if (o == null) {
+ return false;
+ }
+ for (Iterator it = iterator(); it.hasNext();) {
+ if (o.equals(it.next())) {
+ it.remove();
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ private class ValuesIterator extends AbstractKeyIterator implements Iterator {
+ public V next() {
+ return StringKeyedMapAdapter.this.get(nextKey());
+ }
+ }
+
+ private class EntrySet extends AbstractSet> {
+ public Iterator> iterator() {
+ return new EntryIterator();
+ }
+
+ public boolean contains(Object o) {
+ Entry entry = getAsEntry(o);
+ if (entry == null || entry.getKey() == null || entry.getValue() == null) {
+ return false;
+ }
+ V valueFromThisMap = StringKeyedMapAdapter.this.get(entry.getKey());
+ return entry.getValue().equals(valueFromThisMap);
+ }
+
+ public boolean remove(Object o) {
+ Entry entry = getAsEntry(o);
+ if (entry == null || entry.getKey() == null || entry.getValue() == null) {
+ return false;
+ }
+ V valueFromThisMap = StringKeyedMapAdapter.this.get(entry.getKey());
+ if (!entry.getValue().equals(valueFromThisMap)) {
+ return false;
+ }
+ return StringKeyedMapAdapter.this.remove(entry.getKey()) != null;
+ }
+
+ @SuppressWarnings("unchecked")
+ private Entry getAsEntry(Object o) {
+ if (o instanceof Entry) {
+ return (Entry) o;
+ }
+ return null;
+ }
+ }
+
+ private class EntryIterator extends AbstractKeyIterator implements Iterator> {
+ public Entry next() {
+ return new EntrySetEntry(nextKey());
+ }
+ }
+
+ private class EntrySetEntry implements Entry {
+ private final String currentKey;
+
+ public EntrySetEntry(String currentKey) {
+ this.currentKey = currentKey;
+ }
+
+ public String getKey() {
+ return currentKey;
+ }
+
+ public V getValue() {
+ return StringKeyedMapAdapter.this.get(currentKey);
+ }
+
+ public V setValue(V value) {
+ return StringKeyedMapAdapter.this.put(currentKey, value);
+ }
+ }
}
diff --git a/spring-binding/src/main/java/org/springframework/binding/convert/service/NoOpConverter.java b/spring-binding/src/main/java/org/springframework/binding/convert/service/NoOpConverter.java
index f291e430..23c38f6d 100644
--- a/spring-binding/src/main/java/org/springframework/binding/convert/service/NoOpConverter.java
+++ b/spring-binding/src/main/java/org/springframework/binding/convert/service/NoOpConverter.java
@@ -1,58 +1,58 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.binding.convert.service;
-
-import org.springframework.binding.convert.converters.Converter;
-
-/**
- * Package private converter that is a "no op".
- *
- * @author Keith Donald
- */
-class NoOpConverter implements Converter {
-
- private Class> sourceClass;
-
- private Class> targetClass;
-
- /**
- * Create a "no op" converter from given source to given target class.
- */
- public NoOpConverter(Class> sourceClass, Class> targetClass) {
- this.sourceClass = sourceClass;
- this.targetClass = targetClass;
- }
-
- public Class> getSourceClass() {
- return sourceClass;
- }
-
- public Class> getTargetClass() {
- return targetClass;
- }
-
- public Object convertSourceToTargetClass(Object source, Class> targetClass) {
- return source;
- }
-
- public boolean isTwoWay() {
- return true;
- }
-
- public Object convertTargetToSourceClass(Object target, Class> sourceClass) {
- return target;
- }
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.binding.convert.service;
+
+import org.springframework.binding.convert.converters.Converter;
+
+/**
+ * Package private converter that is a "no op".
+ *
+ * @author Keith Donald
+ */
+class NoOpConverter implements Converter {
+
+ private Class> sourceClass;
+
+ private Class> targetClass;
+
+ /**
+ * Create a "no op" converter from given source to given target class.
+ */
+ public NoOpConverter(Class> sourceClass, Class> targetClass) {
+ this.sourceClass = sourceClass;
+ this.targetClass = targetClass;
+ }
+
+ public Class> getSourceClass() {
+ return sourceClass;
+ }
+
+ public Class> getTargetClass() {
+ return targetClass;
+ }
+
+ public Object convertSourceToTargetClass(Object source, Class> targetClass) {
+ return source;
+ }
+
+ public boolean isTwoWay() {
+ return true;
+ }
+
+ public Object convertTargetToSourceClass(Object target, Class> sourceClass) {
+ return target;
+ }
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/support/CollectionAddingExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/support/CollectionAddingExpression.java
index 02d08572..ec0d9408 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/support/CollectionAddingExpression.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/support/CollectionAddingExpression.java
@@ -1,76 +1,76 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.binding.expression.support;
-
-import java.util.Collection;
-
-import org.springframework.binding.expression.EvaluationException;
-import org.springframework.binding.expression.Expression;
-import org.springframework.core.style.ToStringCreator;
-import org.springframework.util.Assert;
-
-/**
- * A settable expression that adds non-null values to a collection.
- *
- * @author Keith Donald
- */
-public class CollectionAddingExpression implements Expression {
-
- /**
- * The expression that resolves a mutable collection reference.
- */
- private Expression collectionExpression;
-
- /**
- * Creates a collection adding property expression.
- * @param collectionExpression the collection expression
- */
- public CollectionAddingExpression(Expression collectionExpression) {
- this.collectionExpression = collectionExpression;
- }
-
- public Object getValue(Object context) throws EvaluationException {
- return collectionExpression.getValue(context);
- }
-
- @SuppressWarnings("unchecked")
- public void setValue(Object context, Object value) throws EvaluationException {
- Object result = getValue(context);
- if (result == null) {
- throw new EvaluationException(context.getClass(), collectionExpression.getExpressionString(),
- "Unable to access collection value for expression '" + collectionExpression.getExpressionString()
- + "'", new IllegalStateException(
- "The collection expression evaluated to a [null] reference"));
- }
- Assert.isInstanceOf(Collection.class, result, "Not a collection: ");
- if (value != null) {
- // add the value to the collection
- ((Collection) result).add(value);
- }
- }
-
- public Class> getValueType(Object context) {
- return Object.class;
- }
-
- public String getExpressionString() {
- return collectionExpression.getExpressionString();
- }
-
- public String toString() {
- return new ToStringCreator(this).append("collectionExpression", collectionExpression).toString();
- }
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.binding.expression.support;
+
+import java.util.Collection;
+
+import org.springframework.binding.expression.EvaluationException;
+import org.springframework.binding.expression.Expression;
+import org.springframework.core.style.ToStringCreator;
+import org.springframework.util.Assert;
+
+/**
+ * A settable expression that adds non-null values to a collection.
+ *
+ * @author Keith Donald
+ */
+public class CollectionAddingExpression implements Expression {
+
+ /**
+ * The expression that resolves a mutable collection reference.
+ */
+ private Expression collectionExpression;
+
+ /**
+ * Creates a collection adding property expression.
+ * @param collectionExpression the collection expression
+ */
+ public CollectionAddingExpression(Expression collectionExpression) {
+ this.collectionExpression = collectionExpression;
+ }
+
+ public Object getValue(Object context) throws EvaluationException {
+ return collectionExpression.getValue(context);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void setValue(Object context, Object value) throws EvaluationException {
+ Object result = getValue(context);
+ if (result == null) {
+ throw new EvaluationException(context.getClass(), collectionExpression.getExpressionString(),
+ "Unable to access collection value for expression '" + collectionExpression.getExpressionString()
+ + "'", new IllegalStateException(
+ "The collection expression evaluated to a [null] reference"));
+ }
+ Assert.isInstanceOf(Collection.class, result, "Not a collection: ");
+ if (value != null) {
+ // add the value to the collection
+ ((Collection) result).add(value);
+ }
+ }
+
+ public Class> getValueType(Object context) {
+ return Object.class;
+ }
+
+ public String getExpressionString() {
+ return collectionExpression.getExpressionString();
+ }
+
+ public String toString() {
+ return new ToStringCreator(this).append("collectionExpression", collectionExpression).toString();
+ }
}
diff --git a/spring-binding/src/test/java/org/springframework/binding/convert/service/StaticConversionExecutorImplTests.java b/spring-binding/src/test/java/org/springframework/binding/convert/service/StaticConversionExecutorImplTests.java
index 0d0bef7c..e32dee1d 100644
--- a/spring-binding/src/test/java/org/springframework/binding/convert/service/StaticConversionExecutorImplTests.java
+++ b/spring-binding/src/test/java/org/springframework/binding/convert/service/StaticConversionExecutorImplTests.java
@@ -1,70 +1,70 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.binding.convert.service;
-
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-import java.util.Date;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.springframework.binding.convert.ConversionExecutionException;
-import org.springframework.binding.convert.converters.StringToDate;
-
-public class StaticConversionExecutorImplTests {
-
- private StaticConversionExecutor conversionExecutor;
-
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.binding.convert.service;
+
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.util.Date;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.binding.convert.ConversionExecutionException;
+import org.springframework.binding.convert.converters.StringToDate;
+
+public class StaticConversionExecutorImplTests {
+
+ private StaticConversionExecutor conversionExecutor;
+
@BeforeEach
- public void setUp() {
- StringToDate stringToDate = new StringToDate();
- conversionExecutor = new StaticConversionExecutor(String.class, Date.class, stringToDate);
- }
-
+ public void setUp() {
+ StringToDate stringToDate = new StringToDate();
+ conversionExecutor = new StaticConversionExecutor(String.class, Date.class, stringToDate);
+ }
+
@Test
- public void testTypeConversion() {
- assertTrue(conversionExecutor.execute("2008-10-10").getClass().equals(Date.class));
- }
-
+ public void testTypeConversion() {
+ assertTrue(conversionExecutor.execute("2008-10-10").getClass().equals(Date.class));
+ }
+
@Test
- public void testAssignmentCompatibleTypeConversion() {
- java.sql.Date date = new java.sql.Date(123L);
- try {
- assertSame(date, conversionExecutor.execute(date));
- fail("Should have failed");
- } catch (ConversionExecutionException e) {
-
- }
- }
-
+ public void testAssignmentCompatibleTypeConversion() {
+ java.sql.Date date = new java.sql.Date(123L);
+ try {
+ assertSame(date, conversionExecutor.execute(date));
+ fail("Should have failed");
+ } catch (ConversionExecutionException e) {
+
+ }
+ }
+
@Test
- public void testConvertNull() {
- assertNull(conversionExecutor.execute(null));
- }
-
+ public void testConvertNull() {
+ assertNull(conversionExecutor.execute(null));
+ }
+
@Test
- public void testIllegalType() {
- try {
- conversionExecutor.execute(new StringBuilder());
- fail();
- } catch (ConversionExecutionException e) {
- // expected
- }
- }
-}
+ public void testIllegalType() {
+ try {
+ conversionExecutor.execute(new StringBuilder());
+ fail();
+ } catch (ConversionExecutionException e) {
+ // expected
+ }
+ }
+}
diff --git a/spring-binding/src/test/java/org/springframework/binding/method/MethodInvocationExceptionTests.java b/spring-binding/src/test/java/org/springframework/binding/method/MethodInvocationExceptionTests.java
index 26da71a1..b56fbd6a 100644
--- a/spring-binding/src/test/java/org/springframework/binding/method/MethodInvocationExceptionTests.java
+++ b/spring-binding/src/test/java/org/springframework/binding/method/MethodInvocationExceptionTests.java
@@ -1,60 +1,60 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.binding.method;
-
-import static org.junit.jupiter.api.Assertions.assertSame;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Test case for {@link MethodInvocationException}.
- *
- * @author Erwin Vervaet
- */
-public class MethodInvocationExceptionTests {
-
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.binding.method;
+
+import static org.junit.jupiter.api.Assertions.assertSame;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Test case for {@link MethodInvocationException}.
+ *
+ * @author Erwin Vervaet
+ */
+public class MethodInvocationExceptionTests {
+
@Test
- public void testGetTargetException() {
- // runtime exception
- IllegalArgumentException iae = new IllegalArgumentException("test");
- MethodInvocationException ex = testException(iae);
- assertSame(iae, ex.getTargetException());
-
- // exception
- IOException ioe = new IOException("test");
- ex = testException(ioe);
- assertSame(ioe, ex.getTargetException());
-
- // nested
- InvocationTargetException ite = new InvocationTargetException(ioe);
- ex = testException(ite);
- assertSame(ioe, ex.getTargetException());
-
- // deep nesting
- ite = new InvocationTargetException(new InvocationTargetException(ioe));
- ex = testException(ite);
- assertSame(ioe, ex.getTargetException());
- }
-
- // internal helpers
-
- private MethodInvocationException testException(Throwable cause) {
- return new MethodInvocationException(new MethodSignature("test"), null, cause);
- }
-}
+ public void testGetTargetException() {
+ // runtime exception
+ IllegalArgumentException iae = new IllegalArgumentException("test");
+ MethodInvocationException ex = testException(iae);
+ assertSame(iae, ex.getTargetException());
+
+ // exception
+ IOException ioe = new IOException("test");
+ ex = testException(ioe);
+ assertSame(ioe, ex.getTargetException());
+
+ // nested
+ InvocationTargetException ite = new InvocationTargetException(ioe);
+ ex = testException(ite);
+ assertSame(ioe, ex.getTargetException());
+
+ // deep nesting
+ ite = new InvocationTargetException(new InvocationTargetException(ioe));
+ ex = testException(ite);
+ assertSame(ioe, ex.getTargetException());
+ }
+
+ // internal helpers
+
+ private MethodInvocationException testException(Throwable cause) {
+ return new MethodInvocationException(new MethodSignature("test"), null, cause);
+ }
+}
diff --git a/spring-binding/src/test/java/org/springframework/binding/method/MethodInvokerTests.java b/spring-binding/src/test/java/org/springframework/binding/method/MethodInvokerTests.java
index 3ab7ce7d..a3331508 100644
--- a/spring-binding/src/test/java/org/springframework/binding/method/MethodInvokerTests.java
+++ b/spring-binding/src/test/java/org/springframework/binding/method/MethodInvokerTests.java
@@ -1,98 +1,98 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.binding.method;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertSame;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.springframework.binding.expression.support.StaticExpression;
-
-/**
- * Unit tests for {@link org.springframework.binding.method.MethodInvoker}.
- *
- * @author Erwin Vervaet
- * @author Jeremy Grelle
- */
-public class MethodInvokerTests {
-
- private MethodInvoker methodInvoker;
-
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.binding.method;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.binding.expression.support.StaticExpression;
+
+/**
+ * Unit tests for {@link org.springframework.binding.method.MethodInvoker}.
+ *
+ * @author Erwin Vervaet
+ * @author Jeremy Grelle
+ */
+public class MethodInvokerTests {
+
+ private MethodInvoker methodInvoker;
+
@BeforeEach
- public void setUp() {
- this.methodInvoker = new MethodInvoker();
- }
-
+ public void setUp() {
+ this.methodInvoker = new MethodInvoker();
+ }
+
@Test
- public void testInvocationTargetException() {
- try {
- methodInvoker.invoke(new MethodSignature("test"), new TestObject(), null);
- fail();
- } catch (MethodInvocationException e) {
- assertTrue(e.getTargetException() instanceof IllegalArgumentException);
- assertEquals("just testing", e.getTargetException().getMessage());
- }
- }
-
+ public void testInvocationTargetException() {
+ try {
+ methodInvoker.invoke(new MethodSignature("test"), new TestObject(), null);
+ fail();
+ } catch (MethodInvocationException e) {
+ assertTrue(e.getTargetException() instanceof IllegalArgumentException);
+ assertEquals("just testing", e.getTargetException().getMessage());
+ }
+ }
+
@Test
- public void testInvalidMethod() {
- try {
- methodInvoker.invoke(new MethodSignature("bogus"), new TestObject(), null);
- fail();
- } catch (MethodInvocationException e) {
- assertTrue(e.getTargetException() instanceof InvalidMethodKeyException);
- }
- }
-
+ public void testInvalidMethod() {
+ try {
+ methodInvoker.invoke(new MethodSignature("bogus"), new TestObject(), null);
+ fail();
+ } catch (MethodInvocationException e) {
+ assertTrue(e.getTargetException() instanceof InvalidMethodKeyException);
+ }
+ }
+
@Test
- public void testBeanArg() {
- Parameters parameters = new Parameters();
- Bean bean = new Bean();
- parameters.add(new Parameter(Bean.class, new StaticExpression(bean)));
- MethodSignature method = new MethodSignature("testBeanArg", parameters);
- assertSame(bean, methodInvoker.invoke(method, new TestObject(), null));
- }
-
+ public void testBeanArg() {
+ Parameters parameters = new Parameters();
+ Bean bean = new Bean();
+ parameters.add(new Parameter(Bean.class, new StaticExpression(bean)));
+ MethodSignature method = new MethodSignature("testBeanArg", parameters);
+ assertSame(bean, methodInvoker.invoke(method, new TestObject(), null));
+ }
+
@Test
- public void testPrimitiveArg() {
- Parameters parameters = new Parameters();
- parameters.add(new Parameter(Boolean.class, new StaticExpression(true)));
- MethodSignature method = new MethodSignature("testPrimitiveArg", parameters);
- assertEquals(Boolean.TRUE, methodInvoker.invoke(method, new TestObject(), null));
- }
-
- static class TestObject {
-
- public void test() {
- throw new IllegalArgumentException("just testing");
- }
-
- public Object testBeanArg(Bean bean) {
- return bean;
- }
-
- public boolean testPrimitiveArg(boolean primitive) {
- return primitive;
- }
- }
-
- static class Bean {
- String value;
- }
-}
+ public void testPrimitiveArg() {
+ Parameters parameters = new Parameters();
+ parameters.add(new Parameter(Boolean.class, new StaticExpression(true)));
+ MethodSignature method = new MethodSignature("testPrimitiveArg", parameters);
+ assertEquals(Boolean.TRUE, methodInvoker.invoke(method, new TestObject(), null));
+ }
+
+ static class TestObject {
+
+ public void test() {
+ throw new IllegalArgumentException("just testing");
+ }
+
+ public Object testBeanArg(Bean bean) {
+ return bean;
+ }
+
+ public boolean testPrimitiveArg(boolean primitive) {
+ return primitive;
+ }
+ }
+
+ static class Bean {
+ String value;
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFManagedBean.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFManagedBean.java
index c8410608..bf2e52dc 100644
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFManagedBean.java
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFManagedBean.java
@@ -1,35 +1,35 @@
-package org.springframework.faces.webflow;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class JSFManagedBean {
-
- String prop1;
- JSFModel model;
- List values = new ArrayList<>();
-
- public JSFModel getModel() {
- return this.model;
- }
-
- public void setModel(JSFModel model) {
- this.model = model;
- }
-
- public String getProp1() {
- return this.prop1;
- }
-
- public void setProp1(String prop1) {
- this.prop1 = prop1;
- }
-
- public void addValue(String value) {
- this.values.add(value);
- }
-
- public List getValues() {
- return this.values;
- }
-}
+package org.springframework.faces.webflow;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class JSFManagedBean {
+
+ String prop1;
+ JSFModel model;
+ List values = new ArrayList<>();
+
+ public JSFModel getModel() {
+ return this.model;
+ }
+
+ public void setModel(JSFModel model) {
+ this.model = model;
+ }
+
+ public String getProp1() {
+ return this.prop1;
+ }
+
+ public void setProp1(String prop1) {
+ this.prop1 = prop1;
+ }
+
+ public void addValue(String value) {
+ this.values.add(value);
+ }
+
+ public List getValues() {
+ return this.values;
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFMockHelper.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFMockHelper.java
index d61bfd62..484ee21f 100644
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFMockHelper.java
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFMockHelper.java
@@ -1,240 +1,240 @@
-package org.springframework.faces.webflow;
-
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLClassLoader;
-
-import javax.faces.FactoryFinder;
-import javax.faces.application.Application;
-import javax.faces.application.ApplicationFactory;
-import javax.faces.component.UIViewRoot;
-import javax.faces.context.FacesContext;
-import javax.faces.context.FacesContextFactory;
-import javax.faces.lifecycle.LifecycleFactory;
-import javax.faces.render.RenderKitFactory;
-
-import org.apache.myfaces.test.base.AbstractJsfTestCase;
-import org.apache.myfaces.test.mock.MockApplicationFactory;
-import org.apache.myfaces.test.mock.MockExternalContext;
-import org.apache.myfaces.test.mock.MockHttpServletRequest;
-import org.apache.myfaces.test.mock.MockHttpServletResponse;
-import org.apache.myfaces.test.mock.MockHttpSession;
-import org.apache.myfaces.test.mock.MockPartialViewContextFactory;
-import org.apache.myfaces.test.mock.MockPrintWriter;
-import org.apache.myfaces.test.mock.MockRenderKit;
-import org.apache.myfaces.test.mock.MockRenderKitFactory;
-import org.apache.myfaces.test.mock.MockResponseWriter;
-import org.apache.myfaces.test.mock.MockServletConfig;
-import org.apache.myfaces.test.mock.MockServletContext;
-import org.apache.myfaces.test.mock.lifecycle.MockLifecycle;
-import org.apache.myfaces.test.mock.lifecycle.MockLifecycleFactory;
-import org.apache.myfaces.test.mock.visit.MockVisitContextFactory;
-
-/**
- * Helper for using the mock JSF environment provided by shale-test inside unit tests that do not extend
- * {@link AbstractJsfTestCase}
- *
- * @author Jeremy Grelle
- * @author Phillip Webb
- */
-public class JSFMockHelper {
-
- private final JSFMock mock = new JSFMock();
-
- public Application application() {
- return this.mock.application();
- }
-
- public MockServletConfig config() {
- return this.mock.config();
- }
-
- public String contentAsString() throws IOException {
- return this.mock.contentAsString();
- }
-
- public MockExternalContext externalContext() {
- return this.mock.externalContext();
- }
-
- public FacesContext facesContext() {
- return this.mock.facesContext();
- }
-
- public FacesContextFactory facesContextFactory() {
- return this.mock.facesContextFactory();
- }
-
- public MockLifecycle lifecycle() {
- return this.mock.lifecycle();
- }
-
- public MockLifecycleFactory lifecycleFactory() {
- return this.mock.lifecycleFactory();
- }
-
- public MockRenderKit renderKit() {
- return this.mock.renderKit();
- }
-
- public MockHttpServletRequest request() {
- return this.mock.request();
- }
-
- public MockHttpServletResponse response() {
- return this.mock.response();
- }
-
- public MockServletContext servletContext() {
- return this.mock.servletContext();
- }
-
- public MockHttpSession session() {
- return this.mock.session();
- }
-
- public void setUp() throws Exception {
- this.mock.setUp();
- }
-
- public void tearDown() throws Exception {
- this.mock.tearDown();
- }
-
- private static class JSFMock extends AbstractJsfTestCase {
-
- private ClassLoader threadContextClassLoader;
-
- public JSFMock() {
- super("JSFMock");
- }
-
- FacesContext facesContext;
- FacesContextFactory facesContextFactory;
-
- public void setUp() throws Exception {
-
- // Ensure no pre-existing FacesContext ..
- if (FacesContext.getCurrentInstance() != null) {
- FacesContext.getCurrentInstance().release();
- }
-
- // Set up a new thread context class loader
- this.threadContextClassLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(
- new URLClassLoader(new URL[0], this.getClass().getClassLoader()));
-
- // Set up Servlet API Objects
- this.servletContext = new MockServletContext();
- this.config = new MockServletConfig(this.servletContext);
- this.session = new MockHttpSession();
- this.session.setServletContext(this.servletContext);
- this.request = new MockHttpServletRequest(this.session);
- this.request.setServletContext(this.servletContext);
- this.response = new MockHttpServletResponse();
-
- // Set up JSF API Objects
- FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName());
- FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY, MockBaseFacesContextFactory.class.getName());
- FactoryFinder.setFactory(FactoryFinder.LIFECYCLE_FACTORY, MockLifecycleFactory.class.getName());
- FactoryFinder.setFactory(FactoryFinder.RENDER_KIT_FACTORY, MockRenderKitFactory.class.getName());
- FactoryFinder.setFactory(FactoryFinder.PARTIAL_VIEW_CONTEXT_FACTORY,
- MockPartialViewContextFactory.class.getName());
- FactoryFinder.setFactory(FactoryFinder.VISIT_CONTEXT_FACTORY, MockVisitContextFactory.class.getName());
- this.lifecycleFactory = (MockLifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
- this.lifecycle = (MockLifecycle) this.lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
- this.facesContextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
- this.facesContext = this.facesContextFactory.getFacesContext(this.servletContext, this.request, this.response, this.lifecycle);
- this.externalContext = (MockExternalContext) this.facesContext.getExternalContext();
- this.facesContext.setResponseWriter(new MockResponseWriter(this.response.getWriter()));
-
- UIViewRoot root = new UIViewRoot();
- root.setViewId("/viewId");
- root.setRenderKitId(RenderKitFactory.HTML_BASIC_RENDER_KIT);
- this.facesContext.setViewRoot(root);
- ApplicationFactory applicationFactory = (ApplicationFactory) FactoryFinder
- .getFactory(FactoryFinder.APPLICATION_FACTORY);
- this.application = (org.apache.myfaces.test.mock.MockApplication) applicationFactory.getApplication();
- RenderKitFactory renderKitFactory = (RenderKitFactory) FactoryFinder
- .getFactory(FactoryFinder.RENDER_KIT_FACTORY);
- this.renderKit = new MockRenderKit();
- renderKitFactory.addRenderKit(RenderKitFactory.HTML_BASIC_RENDER_KIT, this.renderKit);
- }
-
- public void tearDown() throws Exception {
- this.application = null;
- this.config = null;
- this.externalContext = null;
- if (this.facesContext != null) {
- this.facesContext.release();
- }
- this.facesContext = null;
- this.lifecycle = null;
- this.lifecycleFactory = null;
- this.renderKit = null;
- this.request = null;
- this.response = null;
- this.servletContext = null;
- this.session = null;
- FactoryFinder.releaseFactories();
-
- Thread.currentThread().setContextClassLoader(this.threadContextClassLoader);
- this.threadContextClassLoader = null;
- }
-
- public org.apache.myfaces.test.mock.MockApplication application() {
- return this.application;
- }
-
- public MockServletConfig config() {
- return this.config;
- }
-
- public String contentAsString() throws IOException {
- MockPrintWriter writer = (MockPrintWriter) this.response.getWriter();
- return new String(writer.content());
- }
-
- public MockExternalContext externalContext() {
- return this.externalContext;
- }
-
- public FacesContext facesContext() {
- return this.facesContext;
- }
-
- public FacesContextFactory facesContextFactory() {
- return this.facesContextFactory;
- }
-
- public MockLifecycle lifecycle() {
- return this.lifecycle;
- }
-
- public MockLifecycleFactory lifecycleFactory() {
- return this.lifecycleFactory;
- }
-
- public MockRenderKit renderKit() {
- return this.renderKit;
- }
-
- public MockHttpServletRequest request() {
- return this.request;
- }
-
- public MockHttpServletResponse response() {
- return this.response;
- }
-
- public MockServletContext servletContext() {
- return this.servletContext;
- }
-
- public MockHttpSession session() {
- return this.session;
- }
-
- }
-
-}
+package org.springframework.faces.webflow;
+
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+import javax.faces.FactoryFinder;
+import javax.faces.application.Application;
+import javax.faces.application.ApplicationFactory;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.context.FacesContextFactory;
+import javax.faces.lifecycle.LifecycleFactory;
+import javax.faces.render.RenderKitFactory;
+
+import org.apache.myfaces.test.base.AbstractJsfTestCase;
+import org.apache.myfaces.test.mock.MockApplicationFactory;
+import org.apache.myfaces.test.mock.MockExternalContext;
+import org.apache.myfaces.test.mock.MockHttpServletRequest;
+import org.apache.myfaces.test.mock.MockHttpServletResponse;
+import org.apache.myfaces.test.mock.MockHttpSession;
+import org.apache.myfaces.test.mock.MockPartialViewContextFactory;
+import org.apache.myfaces.test.mock.MockPrintWriter;
+import org.apache.myfaces.test.mock.MockRenderKit;
+import org.apache.myfaces.test.mock.MockRenderKitFactory;
+import org.apache.myfaces.test.mock.MockResponseWriter;
+import org.apache.myfaces.test.mock.MockServletConfig;
+import org.apache.myfaces.test.mock.MockServletContext;
+import org.apache.myfaces.test.mock.lifecycle.MockLifecycle;
+import org.apache.myfaces.test.mock.lifecycle.MockLifecycleFactory;
+import org.apache.myfaces.test.mock.visit.MockVisitContextFactory;
+
+/**
+ * Helper for using the mock JSF environment provided by shale-test inside unit tests that do not extend
+ * {@link AbstractJsfTestCase}
+ *
+ * @author Jeremy Grelle
+ * @author Phillip Webb
+ */
+public class JSFMockHelper {
+
+ private final JSFMock mock = new JSFMock();
+
+ public Application application() {
+ return this.mock.application();
+ }
+
+ public MockServletConfig config() {
+ return this.mock.config();
+ }
+
+ public String contentAsString() throws IOException {
+ return this.mock.contentAsString();
+ }
+
+ public MockExternalContext externalContext() {
+ return this.mock.externalContext();
+ }
+
+ public FacesContext facesContext() {
+ return this.mock.facesContext();
+ }
+
+ public FacesContextFactory facesContextFactory() {
+ return this.mock.facesContextFactory();
+ }
+
+ public MockLifecycle lifecycle() {
+ return this.mock.lifecycle();
+ }
+
+ public MockLifecycleFactory lifecycleFactory() {
+ return this.mock.lifecycleFactory();
+ }
+
+ public MockRenderKit renderKit() {
+ return this.mock.renderKit();
+ }
+
+ public MockHttpServletRequest request() {
+ return this.mock.request();
+ }
+
+ public MockHttpServletResponse response() {
+ return this.mock.response();
+ }
+
+ public MockServletContext servletContext() {
+ return this.mock.servletContext();
+ }
+
+ public MockHttpSession session() {
+ return this.mock.session();
+ }
+
+ public void setUp() throws Exception {
+ this.mock.setUp();
+ }
+
+ public void tearDown() throws Exception {
+ this.mock.tearDown();
+ }
+
+ private static class JSFMock extends AbstractJsfTestCase {
+
+ private ClassLoader threadContextClassLoader;
+
+ public JSFMock() {
+ super("JSFMock");
+ }
+
+ FacesContext facesContext;
+ FacesContextFactory facesContextFactory;
+
+ public void setUp() throws Exception {
+
+ // Ensure no pre-existing FacesContext ..
+ if (FacesContext.getCurrentInstance() != null) {
+ FacesContext.getCurrentInstance().release();
+ }
+
+ // Set up a new thread context class loader
+ this.threadContextClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(
+ new URLClassLoader(new URL[0], this.getClass().getClassLoader()));
+
+ // Set up Servlet API Objects
+ this.servletContext = new MockServletContext();
+ this.config = new MockServletConfig(this.servletContext);
+ this.session = new MockHttpSession();
+ this.session.setServletContext(this.servletContext);
+ this.request = new MockHttpServletRequest(this.session);
+ this.request.setServletContext(this.servletContext);
+ this.response = new MockHttpServletResponse();
+
+ // Set up JSF API Objects
+ FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName());
+ FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY, MockBaseFacesContextFactory.class.getName());
+ FactoryFinder.setFactory(FactoryFinder.LIFECYCLE_FACTORY, MockLifecycleFactory.class.getName());
+ FactoryFinder.setFactory(FactoryFinder.RENDER_KIT_FACTORY, MockRenderKitFactory.class.getName());
+ FactoryFinder.setFactory(FactoryFinder.PARTIAL_VIEW_CONTEXT_FACTORY,
+ MockPartialViewContextFactory.class.getName());
+ FactoryFinder.setFactory(FactoryFinder.VISIT_CONTEXT_FACTORY, MockVisitContextFactory.class.getName());
+ this.lifecycleFactory = (MockLifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
+ this.lifecycle = (MockLifecycle) this.lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
+ this.facesContextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
+ this.facesContext = this.facesContextFactory.getFacesContext(this.servletContext, this.request, this.response, this.lifecycle);
+ this.externalContext = (MockExternalContext) this.facesContext.getExternalContext();
+ this.facesContext.setResponseWriter(new MockResponseWriter(this.response.getWriter()));
+
+ UIViewRoot root = new UIViewRoot();
+ root.setViewId("/viewId");
+ root.setRenderKitId(RenderKitFactory.HTML_BASIC_RENDER_KIT);
+ this.facesContext.setViewRoot(root);
+ ApplicationFactory applicationFactory = (ApplicationFactory) FactoryFinder
+ .getFactory(FactoryFinder.APPLICATION_FACTORY);
+ this.application = (org.apache.myfaces.test.mock.MockApplication) applicationFactory.getApplication();
+ RenderKitFactory renderKitFactory = (RenderKitFactory) FactoryFinder
+ .getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+ this.renderKit = new MockRenderKit();
+ renderKitFactory.addRenderKit(RenderKitFactory.HTML_BASIC_RENDER_KIT, this.renderKit);
+ }
+
+ public void tearDown() throws Exception {
+ this.application = null;
+ this.config = null;
+ this.externalContext = null;
+ if (this.facesContext != null) {
+ this.facesContext.release();
+ }
+ this.facesContext = null;
+ this.lifecycle = null;
+ this.lifecycleFactory = null;
+ this.renderKit = null;
+ this.request = null;
+ this.response = null;
+ this.servletContext = null;
+ this.session = null;
+ FactoryFinder.releaseFactories();
+
+ Thread.currentThread().setContextClassLoader(this.threadContextClassLoader);
+ this.threadContextClassLoader = null;
+ }
+
+ public org.apache.myfaces.test.mock.MockApplication application() {
+ return this.application;
+ }
+
+ public MockServletConfig config() {
+ return this.config;
+ }
+
+ public String contentAsString() throws IOException {
+ MockPrintWriter writer = (MockPrintWriter) this.response.getWriter();
+ return new String(writer.content());
+ }
+
+ public MockExternalContext externalContext() {
+ return this.externalContext;
+ }
+
+ public FacesContext facesContext() {
+ return this.facesContext;
+ }
+
+ public FacesContextFactory facesContextFactory() {
+ return this.facesContextFactory;
+ }
+
+ public MockLifecycle lifecycle() {
+ return this.lifecycle;
+ }
+
+ public MockLifecycleFactory lifecycleFactory() {
+ return this.lifecycleFactory;
+ }
+
+ public MockRenderKit renderKit() {
+ return this.renderKit;
+ }
+
+ public MockHttpServletRequest request() {
+ return this.request;
+ }
+
+ public MockHttpServletResponse response() {
+ return this.response;
+ }
+
+ public MockServletContext servletContext() {
+ return this.servletContext;
+ }
+
+ public MockHttpSession session() {
+ return this.session;
+ }
+
+ }
+
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFModel.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFModel.java
index 0b136ee1..d1ca369a 100644
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFModel.java
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFModel.java
@@ -1,13 +1,13 @@
-package org.springframework.faces.webflow;
-
-public class JSFModel {
- String value;
-
- public String getValue() {
- return this.value;
- }
-
- public void setValue(String value) {
- this.value = value;
- }
-}
+package org.springframework.faces.webflow;
+
+public class JSFModel {
+ String value;
+
+ public String getValue() {
+ return this.value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/MockService.java b/spring-faces/src/test/java/org/springframework/faces/webflow/MockService.java
index 8a2183ce..4eb54962 100644
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/MockService.java
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/MockService.java
@@ -1,6 +1,6 @@
-package org.springframework.faces.webflow;
-
-public interface MockService {
-
- void doSomething(String arg);
-}
+package org.springframework.faces.webflow;
+
+public interface MockService {
+
+ void doSomething(String arg);
+}
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/forms.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/forms.css
index 3b3e47ef..26f5e4cb 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/forms.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/forms.css
@@ -1,134 +1,134 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/* FORM ELEMENTS */
- form {
- margin:0;
- padding:0;
- }
- form div,
- form p {
- margin: 0 0 1em 0;
- padding: 0;
-
- font-size: 1em;
- }
- label {
- font-weight: bold;
- }
- fieldset {
- padding: 5px 10px;
- margin: 0 0 1.5em 0;
-
- border: 1px solid #eee;
- }
- fieldset legend {
- margin: 0 0 0 0px;
- padding: 0;
-
- font-size: 1.1em;
- font-weight: bold;
-
- color: #666;
- background-color: white;
- }
- * html fieldset legend {
- margin: 0 0 10px -10px;
- }
- fieldset ul {
- margin: 0 0 1.5em 0;
- padding: 0;
-
- list-style: none;
- }
- fieldset ul li {
- margin: 0 0 0.5em 0;
- padding: 0;
-
- list-style: none;
- }
- input, select, textarea {
- margin: 0;
- padding: 2px;
-
- font-size: 1em;
- font-family: arial, helvetica, verdana, sans-serif;
- }
-
- input, select {
- vertical-align: middle;
- }
- textarea {
- width: 200px;
- height: 8em;
- }
-
- input.check {
- width: auto;
- height: auto;
-
- margin: 0;
-
- border: none;
- }
- input.radio {
- width: auto;
-
- height: auto;
- margin: 0;
-
- border: none;
- }
- input.file {
- width: 250px;
- height: auto;
- }
- input.readonly {
- background-color: transparent;
- border: none;
- }
- input.button {
- width: 10em;
-
- background-color: #ddd;
- border: 1px solid black;
- }
- input.image {
- width: auto;
- height: auto;
-
- border: none;
- }
-
- form div.submit {
- margin: 1em 0;
- }
- form div.submit input {
- width: 15em;
- height: 2em;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* FORM ELEMENTS */
+ form {
+ margin:0;
+ padding:0;
+ }
+ form div,
+ form p {
+ margin: 0 0 1em 0;
+ padding: 0;
+
+ font-size: 1em;
+ }
+ label {
+ font-weight: bold;
+ }
+ fieldset {
+ padding: 5px 10px;
+ margin: 0 0 1.5em 0;
+
+ border: 1px solid #eee;
+ }
+ fieldset legend {
+ margin: 0 0 0 0px;
+ padding: 0;
+
+ font-size: 1.1em;
+ font-weight: bold;
+
+ color: #666;
+ background-color: white;
+ }
+ * html fieldset legend {
+ margin: 0 0 10px -10px;
+ }
+ fieldset ul {
+ margin: 0 0 1.5em 0;
+ padding: 0;
+
+ list-style: none;
+ }
+ fieldset ul li {
+ margin: 0 0 0.5em 0;
+ padding: 0;
+
+ list-style: none;
+ }
+ input, select, textarea {
+ margin: 0;
+ padding: 2px;
+
+ font-size: 1em;
+ font-family: arial, helvetica, verdana, sans-serif;
+ }
+
+ input, select {
+ vertical-align: middle;
+ }
+ textarea {
+ width: 200px;
+ height: 8em;
+ }
+
+ input.check {
+ width: auto;
+ height: auto;
+
+ margin: 0;
+
+ border: none;
+ }
+ input.radio {
+ width: auto;
+
+ height: auto;
+ margin: 0;
+
+ border: none;
+ }
+ input.file {
+ width: 250px;
+ height: auto;
+ }
+ input.readonly {
+ background-color: transparent;
+ border: none;
+ }
+ input.button {
+ width: 10em;
+
+ background-color: #ddd;
+ border: 1px solid black;
+ }
+ input.image {
+ width: auto;
+ height: auto;
+
+ border: none;
+ }
+
+ form div.submit {
+ margin: 1em 0;
+ }
+ form div.submit input {
+ width: 15em;
+ height: 2em;
+ }
/* END FORM ELEMENTS */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-1col.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-1col.css
index 7f3de7b4..695aa689 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-1col.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-1col.css
@@ -1,52 +1,52 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-@import url("nav-horizontal.css");
-
-/* NAV BAR AT THE TOP AND ONE COLUMN OF CONTENT */
- div#content {
- position: relative;
- width: 701px;
-
- margin: 0 auto 20px auto;
- padding: 0;
-
- text-align: left;
- }
- div#main {
- width: 100%;
- }
- div#local {
- display: none;
- }
- div#sub {
- display: none;
- }
- div#nav {
- display: none;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+@import url("nav-horizontal.css");
+
+/* NAV BAR AT THE TOP AND ONE COLUMN OF CONTENT */
+ div#content {
+ position: relative;
+ width: 701px;
+
+ margin: 0 auto 20px auto;
+ padding: 0;
+
+ text-align: left;
+ }
+ div#main {
+ width: 100%;
+ }
+ div#local {
+ display: none;
+ }
+ div#sub {
+ display: none;
+ }
+ div#nav {
+ display: none;
+ }
/* END CONTENT */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navleft-1col.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navleft-1col.css
index 9840d71c..48b9ebc6 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navleft-1col.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navleft-1col.css
@@ -1,56 +1,56 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-@import url("nav-vertical.css");
-
-/* NAV BAR ON THE LEFT AND ONE COLUMN OF CONTENT */
- div#content {
- position: relative;
- width: 780px;
-
- margin: 0 auto 20px auto;
- padding: 0;
-
- text-align: left;
- }
- div#main {
- float: right;
- width: 560px;
- display: inline;
- }
- div#local {
- display: none;
- }
- div#sub {
- display: none;
- }
- div#nav {
- float: left;
- width: 200px;
- display: inline;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+@import url("nav-vertical.css");
+
+/* NAV BAR ON THE LEFT AND ONE COLUMN OF CONTENT */
+ div#content {
+ position: relative;
+ width: 780px;
+
+ margin: 0 auto 20px auto;
+ padding: 0;
+
+ text-align: left;
+ }
+ div#main {
+ float: right;
+ width: 560px;
+ display: inline;
+ }
+ div#local {
+ display: none;
+ }
+ div#sub {
+ display: none;
+ }
+ div#nav {
+ float: left;
+ width: 200px;
+ display: inline;
+ }
/* END CONTENT */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navleft-2col.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navleft-2col.css
index a2fa6061..adbc1215 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navleft-2col.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navleft-2col.css
@@ -1,64 +1,64 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-@import url("nav-vertical.css");
-
-/* NAV BAR ON THE LEFT AND TWO COLUMNS OF CONTENT */
- div#content {
- position: relative;
- width: 780px;
-
- margin: 0 auto 20px auto;
- padding: 0;
-
- text-align: left;
- }
- div#main {
- float: right;
- width: 340px;
- display: inline;
-
- margin-right: 220px;
- margin-left: -220px;
- }
- div#local {
- display: none;
- }
- div#sub {
- float: right;
- width: 200px;
- display: inline;
-
- margin-right: -340px;
- margin-left: 200px;
- }
- div#nav {
- float: left;
- width: 200px;
- display: inline;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+@import url("nav-vertical.css");
+
+/* NAV BAR ON THE LEFT AND TWO COLUMNS OF CONTENT */
+ div#content {
+ position: relative;
+ width: 780px;
+
+ margin: 0 auto 20px auto;
+ padding: 0;
+
+ text-align: left;
+ }
+ div#main {
+ float: right;
+ width: 340px;
+ display: inline;
+
+ margin-right: 220px;
+ margin-left: -220px;
+ }
+ div#local {
+ display: none;
+ }
+ div#sub {
+ float: right;
+ width: 200px;
+ display: inline;
+
+ margin-right: -340px;
+ margin-left: 200px;
+ }
+ div#nav {
+ float: left;
+ width: 200px;
+ display: inline;
+ }
/* END CONTENT */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-1col.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-1col.css
index 635494b7..e5b6ceea 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-1col.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-1col.css
@@ -1,57 +1,57 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-@import url("nav-horizontal.css");
-
-/* NAV BAR AT THE TOP AND ONE COLUMN OF CONTENT */
- div#content {
- position: relative;
- width: 701px;
-
- margin: 0 auto 20px auto;
- padding: 0;
-
- text-align: left;
- }
- div#main {
- width: 100%;
- }
- div#local {
- width: 100%;
- }
- div#sub {
- width: 100%;
- }
- div#nav {
- position: absolute;
- top: -15px;
- left: 0;
- width: 100%;
-
- text-align: left;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+@import url("nav-horizontal.css");
+
+/* NAV BAR AT THE TOP AND ONE COLUMN OF CONTENT */
+ div#content {
+ position: relative;
+ width: 701px;
+
+ margin: 0 auto 20px auto;
+ padding: 0;
+
+ text-align: left;
+ }
+ div#main {
+ width: 100%;
+ }
+ div#local {
+ width: 100%;
+ }
+ div#sub {
+ width: 100%;
+ }
+ div#nav {
+ position: absolute;
+ top: -15px;
+ left: 0;
+ width: 100%;
+
+ text-align: left;
+ }
/* END CONTENT */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-3col.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-3col.css
index 599fa997..a2ceab4f 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-3col.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-3col.css
@@ -1,68 +1,68 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-@import url("nav-horizontal.css");
-
-/* NAV BAR AT THE TOP, LOCAL NAV ON THE LEFT AND TWO COLUMNS OF CONTENT */
- div#content {
- position: relative;
- width: 701px;
-
- margin: 0 auto 20px auto;
- padding: 0;
-
- text-align: left;
- }
- div#main {
- float: left;
- width: 300px;
- display: inline;
-
- margin-right: -200px;
- margin-left: 200px;
- }
- div#sub {
- float: right;
- width: 180px;
- display: inline;
- }
- div#local {
- float: left;
- width: 180px;
- display: inline;
-
- margin-left: -300px;
- }
- div#nav {
- position: absolute;
- top: -15px;
- left: 0;
- width: 701px;
-
- text-align: left;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+@import url("nav-horizontal.css");
+
+/* NAV BAR AT THE TOP, LOCAL NAV ON THE LEFT AND TWO COLUMNS OF CONTENT */
+ div#content {
+ position: relative;
+ width: 701px;
+
+ margin: 0 auto 20px auto;
+ padding: 0;
+
+ text-align: left;
+ }
+ div#main {
+ float: left;
+ width: 300px;
+ display: inline;
+
+ margin-right: -200px;
+ margin-left: 200px;
+ }
+ div#sub {
+ float: right;
+ width: 180px;
+ display: inline;
+ }
+ div#local {
+ float: left;
+ width: 180px;
+ display: inline;
+
+ margin-left: -300px;
+ }
+ div#nav {
+ position: absolute;
+ top: -15px;
+ left: 0;
+ width: 701px;
+
+ text-align: left;
+ }
/* END CONTENT */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-localleft.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-localleft.css
index 1cf0c61d..b9c0e6ef 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-localleft.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-localleft.css
@@ -1,61 +1,61 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-@import url("nav-horizontal.css");
-
-/* NAV BAR AT THE TOP, LOCAL NAVIGATION ON THE LEFT AND ONE COLUMN OF CONTENT */
- div#content {
- position: relative;
- width: 701px;
-
- margin: 0 auto 20px auto;
- padding: 0;
-
- text-align: left;
- }
- div#main {
- float: right;
- width: 500px;
- display: inline;
- }
- div#local {
- float: left;
- width: 200px;
- display: inline;
- }
- div#sub {
- display: none;
- }
- div#nav {
- position: absolute;
- top: -15px;
- left: 0;
- width: 100%;
-
- text-align: left;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+@import url("nav-horizontal.css");
+
+/* NAV BAR AT THE TOP, LOCAL NAVIGATION ON THE LEFT AND ONE COLUMN OF CONTENT */
+ div#content {
+ position: relative;
+ width: 701px;
+
+ margin: 0 auto 20px auto;
+ padding: 0;
+
+ text-align: left;
+ }
+ div#main {
+ float: right;
+ width: 500px;
+ display: inline;
+ }
+ div#local {
+ float: left;
+ width: 200px;
+ display: inline;
+ }
+ div#sub {
+ display: none;
+ }
+ div#nav {
+ position: absolute;
+ top: -15px;
+ left: 0;
+ width: 100%;
+
+ text-align: left;
+ }
/* END CONTENT */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-subright.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-subright.css
index 47384ca1..72360c6e 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-subright.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout-navtop-subright.css
@@ -1,61 +1,61 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-@import url("nav-horizontal.css");
-
-/* NAV BAR AT THE TOP AND TWO COLUMNS OF CONTENT */
- div#content {
- position: relative;
- width: 701px;
-
- margin: 0 auto 20px auto;
- padding: 0;
-
- text-align: left;
- }
- div#main {
- float: left;
- width: 480px;
- display: inline;
- }
- div#sub {
- float: right;
- width: 200px;
- display: inline;
- }
- div#local {
- display: none;
- }
- div#nav {
- position: absolute;
- top: -15px;
- left: 0;
- width: 100%;
-
- text-align: left;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+@import url("nav-horizontal.css");
+
+/* NAV BAR AT THE TOP AND TWO COLUMNS OF CONTENT */
+ div#content {
+ position: relative;
+ width: 701px;
+
+ margin: 0 auto 20px auto;
+ padding: 0;
+
+ text-align: left;
+ }
+ div#main {
+ float: left;
+ width: 480px;
+ display: inline;
+ }
+ div#sub {
+ float: right;
+ width: 200px;
+ display: inline;
+ }
+ div#local {
+ display: none;
+ }
+ div#nav {
+ position: absolute;
+ top: -15px;
+ left: 0;
+ width: 100%;
+
+ text-align: left;
+ }
/* END CONTENT */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout.css
index b6f3cfe0..7beb4f22 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/layout.css
@@ -1,152 +1,152 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/* SITE SPECIFIC LAYOUT */
- body {
- margin: 0;
- padding: 0;
-
- text-align: center;
-
- background: white;
- }
- div#page {
- width: 780px;
-
- margin: 0 auto;
- padding: 0;
-
- text-align: center;
-
- background: white;
- }
-
- /* HEADER */
- div#header {
- margin: 0 0 5em 0;
- padding: 40px 20px;
-
- color: white;
- background: black;
-
- text-align: left;
- }
- div#branding {
- float: left;
- width: 40%;
-
- margin: 0;
- padding: 10px 0 10px 20px;
-
- text-align: left;
- }
- div#search {
- float: right;
- width: 49%;
-
- margin: 0;
- padding: 16px 20px 0 0;
-
- text-align: right;
- }
- /* END HEADER */
-
-
- /* CONTENT */
- div#content {
-
- }
-
- /* MAIN */
- div#main {
-
- }
- /* END MAIN */
-
- /* SUB */
- div#sub {
-
- }
- /* END SUB */
-
- /* END CONTENT */
-
-
- /* FOOTER */
- div#footer {
- color: white;
- background-color: black;
- }
- div#footer p {
- margin: 0;
- padding: 15px;
-
- font-size: 0.8em;
- }
- /* END FOOTER */
-/* END LAYOUT */
-
-
-/* UL.SUBNAV */
- ul.subnav {
- margin: 0;
- padding: 0;
-
- font-size: 0.8em;
- list-style: none;
- }
- ul.subnav li {
- margin: 0 0 1em 0;
- padding: 0;
-
- list-style: none;
- }
- ul.subnav li a,
- ul.subnav li a:link,
- ul.subnav li a:visited,
- ul.subnav li a:active {
- text-decoration: none;
- font-weight: bold;
-
- color: black;
- }
- ul.subnav li a:hover {
- text-decoration: underline;
- }
- ul.subnav li strong {
- padding: 0 0 0 12px;
-
- background: url("../i/subnav-highlight.gif") left top no-repeat transparent;
- }
- ul.subnav li strong a,
- ul.subnav li strong a:link,
- ul.subnav li strong a:visited,
- ul.subnav li strong a:active {
- color: white;
- background-color: black;
- }
-/* END UL.SUBNAV */
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* SITE SPECIFIC LAYOUT */
+ body {
+ margin: 0;
+ padding: 0;
+
+ text-align: center;
+
+ background: white;
+ }
+ div#page {
+ width: 780px;
+
+ margin: 0 auto;
+ padding: 0;
+
+ text-align: center;
+
+ background: white;
+ }
+
+ /* HEADER */
+ div#header {
+ margin: 0 0 5em 0;
+ padding: 40px 20px;
+
+ color: white;
+ background: black;
+
+ text-align: left;
+ }
+ div#branding {
+ float: left;
+ width: 40%;
+
+ margin: 0;
+ padding: 10px 0 10px 20px;
+
+ text-align: left;
+ }
+ div#search {
+ float: right;
+ width: 49%;
+
+ margin: 0;
+ padding: 16px 20px 0 0;
+
+ text-align: right;
+ }
+ /* END HEADER */
+
+
+ /* CONTENT */
+ div#content {
+
+ }
+
+ /* MAIN */
+ div#main {
+
+ }
+ /* END MAIN */
+
+ /* SUB */
+ div#sub {
+
+ }
+ /* END SUB */
+
+ /* END CONTENT */
+
+
+ /* FOOTER */
+ div#footer {
+ color: white;
+ background-color: black;
+ }
+ div#footer p {
+ margin: 0;
+ padding: 15px;
+
+ font-size: 0.8em;
+ }
+ /* END FOOTER */
+/* END LAYOUT */
+
+
+/* UL.SUBNAV */
+ ul.subnav {
+ margin: 0;
+ padding: 0;
+
+ font-size: 0.8em;
+ list-style: none;
+ }
+ ul.subnav li {
+ margin: 0 0 1em 0;
+ padding: 0;
+
+ list-style: none;
+ }
+ ul.subnav li a,
+ ul.subnav li a:link,
+ ul.subnav li a:visited,
+ ul.subnav li a:active {
+ text-decoration: none;
+ font-weight: bold;
+
+ color: black;
+ }
+ ul.subnav li a:hover {
+ text-decoration: underline;
+ }
+ ul.subnav li strong {
+ padding: 0 0 0 12px;
+
+ background: url("../i/subnav-highlight.gif") left top no-repeat transparent;
+ }
+ ul.subnav li strong a,
+ ul.subnav li strong a:link,
+ ul.subnav li strong a:visited,
+ ul.subnav li strong a:active {
+ color: white;
+ background-color: black;
+ }
+/* END UL.SUBNAV */
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/nav-horizontal.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/nav-horizontal.css
index 2af4f2bc..5b9716ab 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/nav-horizontal.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/nav-horizontal.css
@@ -1,105 +1,105 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/* NAV */
- div#nav {
- font-size: 0.8em;
- }
- * html div#nav {
- /* hide ie/mac \*/
- height: 1%;
- /* end hide */
- }
- div#nav div.wrapper {
- position: absolute;
- left: 0;
- bottom: 0;
- width: 100%;
- }
- div#nav ul {
- width: 100%;
-
- margin: 0;
- padding: 0;
-
- line-height: 1em;
- list-style: none;
- }
- div#nav li {
- float: left;
- display: inline;
-
- margin: 0;
- padding: 0;
-
- list-style: none;
-
- line-height: 1em;
- border-right: 1px solid #aaa;
- }
- div#nav li.last {
- border-right: none;
- }
- div#nav a,
- div#nav a:link,
- div#nav a:active,
- div#nav a:visited {
- display: inline-block;
- /* hide from ie/mac \*/
- display: block;
- /* end hide */
-
- margin: 0;
- padding: 5px 38px 5px 38px;
-
- font-weight: bold;
- text-decoration: none;
-
- color: black;
- background: #ddd;
- }
- div#nav a:hover {
- text-decoration: underline;
- }
- div#nav strong {
- display: inline-block;
- /* hide from ie/mac \*/
- display: block;
- /* end hide */
-
- color: white;
- background: black;
- }
- div#nav strong a,
- div#nav strong a:link,
- div#nav strong a:active,
- div#nav strong a:visited,
- div#nav strong a:hover {
- color: white;
- background-color: black;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* NAV */
+ div#nav {
+ font-size: 0.8em;
+ }
+ * html div#nav {
+ /* hide ie/mac \*/
+ height: 1%;
+ /* end hide */
+ }
+ div#nav div.wrapper {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ }
+ div#nav ul {
+ width: 100%;
+
+ margin: 0;
+ padding: 0;
+
+ line-height: 1em;
+ list-style: none;
+ }
+ div#nav li {
+ float: left;
+ display: inline;
+
+ margin: 0;
+ padding: 0;
+
+ list-style: none;
+
+ line-height: 1em;
+ border-right: 1px solid #aaa;
+ }
+ div#nav li.last {
+ border-right: none;
+ }
+ div#nav a,
+ div#nav a:link,
+ div#nav a:active,
+ div#nav a:visited {
+ display: inline-block;
+ /* hide from ie/mac \*/
+ display: block;
+ /* end hide */
+
+ margin: 0;
+ padding: 5px 38px 5px 38px;
+
+ font-weight: bold;
+ text-decoration: none;
+
+ color: black;
+ background: #ddd;
+ }
+ div#nav a:hover {
+ text-decoration: underline;
+ }
+ div#nav strong {
+ display: inline-block;
+ /* hide from ie/mac \*/
+ display: block;
+ /* end hide */
+
+ color: white;
+ background: black;
+ }
+ div#nav strong a,
+ div#nav strong a:link,
+ div#nav strong a:active,
+ div#nav strong a:visited,
+ div#nav strong a:hover {
+ color: white;
+ background-color: black;
+ }
/* END NAV */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/nav-vertical.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/nav-vertical.css
index 56d8f5dc..674ed81a 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/nav-vertical.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/nav-vertical.css
@@ -1,104 +1,104 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/* NAV */
- div#nav {
- font-size: 0.8em;
- }
- * html div#nav {
- /* hide ie/mac \*/
- height: 1%;
- /* end hide */
- }
- div#nav div.wrapper {
- width: 100%;
-
- background: #ddd;
- }
- div#nav ul {
- width: 100%;
-
- margin: 0;
- padding: 0;
-
- line-height: 1em;
- list-style: none;
- }
- div#nav li {
- display: block;
-
- margin: 0;
- padding: 0;
-
- list-style: none;
-
- line-height: 1em;
- }
- * html div#nav li {
- /* hide ie/mac \*/
- height: 1%;
- /* end hide */
- }
- div#nav li.last {
-
- }
- div#nav a,
- div#nav a:link,
- div#nav a:active,
- div#nav a:visited {
- display: block;
-
- font-weight: bold;
- text-decoration: none;
-
- margin: 0;
- padding: 5px 10px 5px 10px;
-
- color: black;
- background: white;
- }
- div#nav a:hover {
- text-decoration: underline;
-
- color: white;
- background: black;
- }
- div#nav strong {
- display: block;
-
- color: white;
- background: black;
- }
- div#nav strong a,
- div#nav strong a:link,
- div#nav strong a:active,
- div#nav strong a:visited,
- div#nav strong a:hover {
- color: white;
- background-color: black;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* NAV */
+ div#nav {
+ font-size: 0.8em;
+ }
+ * html div#nav {
+ /* hide ie/mac \*/
+ height: 1%;
+ /* end hide */
+ }
+ div#nav div.wrapper {
+ width: 100%;
+
+ background: #ddd;
+ }
+ div#nav ul {
+ width: 100%;
+
+ margin: 0;
+ padding: 0;
+
+ line-height: 1em;
+ list-style: none;
+ }
+ div#nav li {
+ display: block;
+
+ margin: 0;
+ padding: 0;
+
+ list-style: none;
+
+ line-height: 1em;
+ }
+ * html div#nav li {
+ /* hide ie/mac \*/
+ height: 1%;
+ /* end hide */
+ }
+ div#nav li.last {
+
+ }
+ div#nav a,
+ div#nav a:link,
+ div#nav a:active,
+ div#nav a:visited {
+ display: block;
+
+ font-weight: bold;
+ text-decoration: none;
+
+ margin: 0;
+ padding: 5px 10px 5px 10px;
+
+ color: black;
+ background: white;
+ }
+ div#nav a:hover {
+ text-decoration: underline;
+
+ color: white;
+ background: black;
+ }
+ div#nav strong {
+ display: block;
+
+ color: white;
+ background: black;
+ }
+ div#nav strong a,
+ div#nav strong a:link,
+ div#nav strong a:active,
+ div#nav strong a:visited,
+ div#nav strong a:hover {
+ color: white;
+ background-color: black;
+ }
/* END NAV */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/tools.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/tools.css
index 0555cb08..2bc3c556 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/tools.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/tools.css
@@ -1,64 +1,64 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/* clearing */
- .stretch,
- .clear {
- clear: both;
- height: 1px;
-
- margin: 0;
- padding: 0;
-
- font-size: 15px;
- line-height: 1px;
- }
- .clearfix:after {
- clear: both;
- height: 0;
-
- display: block;
- visibility: hidden;
-
- content: ".";
- }
- .clearfix {display:inline-block;}
- /* Hide from IE Mac \*/
- .clearfix {display:block;}
- /* End hide from IE Mac */
-/* end clearing */
-
-/* accessibility */
- span.accesskey {
- text-decoration: none;
- }
- .accessibility {
- position: absolute;
- top: -999em;
- left: -999em;
- }
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* clearing */
+ .stretch,
+ .clear {
+ clear: both;
+ height: 1px;
+
+ margin: 0;
+ padding: 0;
+
+ font-size: 15px;
+ line-height: 1px;
+ }
+ .clearfix:after {
+ clear: both;
+ height: 0;
+
+ display: block;
+ visibility: hidden;
+
+ content: ".";
+ }
+ .clearfix {display:inline-block;}
+ /* Hide from IE Mac \*/
+ .clearfix {display:block;}
+ /* End hide from IE Mac */
+/* end clearing */
+
+/* accessibility */
+ span.accesskey {
+ text-decoration: none;
+ }
+ .accessibility {
+ position: absolute;
+ top: -999em;
+ left: -999em;
+ }
/* end accessibility */
\ No newline at end of file
diff --git a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/typo.css b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/typo.css
index 9f54ab95..10296ffe 100644
--- a/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/typo.css
+++ b/spring-js-resources/src/main/resources/META-INF/web-resources/css-framework/css/typo.css
@@ -1,228 +1,228 @@
-/*
-A CSS Framework by Mike Stenhouse of Content with Style
--------------------------------------------------------
-
-Copyright (c) 2005, Mike Stenhouse of Content with Style
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/* TYPOGRAPHY */
- body {
- text-align: left;
- font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
- font-size: 76%;
- line-height: 1em;
-
- color: #333;
- }
- div {
- font-size: 1em;
- }
- img {
- border: 0;
- }
-
-/* LINKS */
- a,
- a:link,
- a:active {
- text-decoration: underline;
-
- color: blue;
- background-color: white;
- }
- a:visited {
- color: purple;
- background-color: transparent;
- }
- a:hover {
- text-decoration: none;
-
- color: white;
- background-color: black;
- }
-/* END LINKS */
-
-/* HEADINGS */
- h1 {
- margin: 0 0 0.5em 0;
- padding: 0;
-
- font-size: 2em;
- line-height: 1.5em;
-
- color: black;
- }
- h2 {
- margin: 0 0 0.5em 0;
- padding: 0;
-
- font-size: 1.5em;
- line-height: 1.5em;
-
- color: black;
- }
- h3 {
- margin: 0 0 0.5em 0;
- padding:0;
-
- font-size: 1.3em;
- line-height: 1.3em;
-
- color: black;
- }
- h4 {
- margin: 0 0 0.25em 0;
- padding: 0;
-
- font-size: 1.2em;
- line-height: 1.3em;
-
- color: black;
- }
- h5 {
- margin: 0 0 0.25em 0;
- padding: 0;
-
- font-size: 1.1em;
- line-height: 1.3em;
-
- color: black;
- }
- h6 {
- margin: 0 0 0.25em 0;
- padding: 0;
-
- font-size: 1em;
- line-height: 1.3em;
-
- color: black;
- }
-/* END HEADINGS */
-
-/* TEXT */
- p {
- margin: 0 0 1.5em 0;
- padding: 0;
-
- font-size: 1em;
- line-height:1.4em;
- }
- blockquote {
- margin-left: 10px;
-
- border-left: 10px solid #ddd;
- }
- pre {
- font-family: monospace;
- font-size: 1.0em;
- }
- strong, b {
- font-weight: bold;
- }
- em, i {
- font-style:italic;
- }
- code {
- font-family: "Courier New", Courier, monospace;
- font-size: 1em;
- white-space: pre;
- }
-/* END TEXT */
-
-/* LISTS */
- ul {
- margin: 0 0 1.5em 0;
- padding: 0;
-
- line-height:1.4em;
- }
- ul li {
- margin: 0 0 0.25em 30px;
- padding: 0;
- }
- ol {
- margin: 0 0 1.5em 0;
- padding: 0;
-
- font-size: 1.0em;
- line-height: 1.4em;
- }
- ol li {
- margin: 0 0 0.25em 30px;
- padding: 0;
-
- font-size: 1.0em;
- }
- dl {
- margin: 0 0 1.5em 0;
- padding: 0;
-
- line-height: 1.4em;
- }
- dl dt {
- margin: 0.25em 0 0.25em 0;
- padding: 0;
-
- font-weight: bold;
- }
- dl dd {
- margin: 0 0 0 30px;
- padding: 0;
- }
-/* END LISTS */
-
-
-/* TABLE */
- table {
- margin: 0 0 1.5em 0;
- padding: 0;
-
- font-size: 1em;
- }
- table caption {
- margin: 0;
- padding: 0 0 1.5em 0;
-
- font-weight: bold;
- }
- th {
- font-weight: bold;
- text-align: left;
- }
- td {
- font-size: 1em;
- }
-/* END TABLE */
-
- hr {
- display: none;
- }
- div.hr {
- height: 1px;
-
- margin: 1.5em 10px;
-
- border-bottom: 1px dotted black;
- }
-
+/*
+A CSS Framework by Mike Stenhouse of Content with Style
+-------------------------------------------------------
+
+Copyright (c) 2005, Mike Stenhouse of Content with Style
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* TYPOGRAPHY */
+ body {
+ text-align: left;
+ font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
+ font-size: 76%;
+ line-height: 1em;
+
+ color: #333;
+ }
+ div {
+ font-size: 1em;
+ }
+ img {
+ border: 0;
+ }
+
+/* LINKS */
+ a,
+ a:link,
+ a:active {
+ text-decoration: underline;
+
+ color: blue;
+ background-color: white;
+ }
+ a:visited {
+ color: purple;
+ background-color: transparent;
+ }
+ a:hover {
+ text-decoration: none;
+
+ color: white;
+ background-color: black;
+ }
+/* END LINKS */
+
+/* HEADINGS */
+ h1 {
+ margin: 0 0 0.5em 0;
+ padding: 0;
+
+ font-size: 2em;
+ line-height: 1.5em;
+
+ color: black;
+ }
+ h2 {
+ margin: 0 0 0.5em 0;
+ padding: 0;
+
+ font-size: 1.5em;
+ line-height: 1.5em;
+
+ color: black;
+ }
+ h3 {
+ margin: 0 0 0.5em 0;
+ padding:0;
+
+ font-size: 1.3em;
+ line-height: 1.3em;
+
+ color: black;
+ }
+ h4 {
+ margin: 0 0 0.25em 0;
+ padding: 0;
+
+ font-size: 1.2em;
+ line-height: 1.3em;
+
+ color: black;
+ }
+ h5 {
+ margin: 0 0 0.25em 0;
+ padding: 0;
+
+ font-size: 1.1em;
+ line-height: 1.3em;
+
+ color: black;
+ }
+ h6 {
+ margin: 0 0 0.25em 0;
+ padding: 0;
+
+ font-size: 1em;
+ line-height: 1.3em;
+
+ color: black;
+ }
+/* END HEADINGS */
+
+/* TEXT */
+ p {
+ margin: 0 0 1.5em 0;
+ padding: 0;
+
+ font-size: 1em;
+ line-height:1.4em;
+ }
+ blockquote {
+ margin-left: 10px;
+
+ border-left: 10px solid #ddd;
+ }
+ pre {
+ font-family: monospace;
+ font-size: 1.0em;
+ }
+ strong, b {
+ font-weight: bold;
+ }
+ em, i {
+ font-style:italic;
+ }
+ code {
+ font-family: "Courier New", Courier, monospace;
+ font-size: 1em;
+ white-space: pre;
+ }
+/* END TEXT */
+
+/* LISTS */
+ ul {
+ margin: 0 0 1.5em 0;
+ padding: 0;
+
+ line-height:1.4em;
+ }
+ ul li {
+ margin: 0 0 0.25em 30px;
+ padding: 0;
+ }
+ ol {
+ margin: 0 0 1.5em 0;
+ padding: 0;
+
+ font-size: 1.0em;
+ line-height: 1.4em;
+ }
+ ol li {
+ margin: 0 0 0.25em 30px;
+ padding: 0;
+
+ font-size: 1.0em;
+ }
+ dl {
+ margin: 0 0 1.5em 0;
+ padding: 0;
+
+ line-height: 1.4em;
+ }
+ dl dt {
+ margin: 0.25em 0 0.25em 0;
+ padding: 0;
+
+ font-weight: bold;
+ }
+ dl dd {
+ margin: 0 0 0 30px;
+ padding: 0;
+ }
+/* END LISTS */
+
+
+/* TABLE */
+ table {
+ margin: 0 0 1.5em 0;
+ padding: 0;
+
+ font-size: 1em;
+ }
+ table caption {
+ margin: 0;
+ padding: 0 0 1.5em 0;
+
+ font-weight: bold;
+ }
+ th {
+ font-weight: bold;
+ text-align: left;
+ }
+ td {
+ font-size: 1em;
+ }
+/* END TABLE */
+
+ hr {
+ display: none;
+ }
+ div.hr {
+ height: 1px;
+
+ margin: 1.5em 10px;
+
+ border-bottom: 1px dotted black;
+ }
+
/* END TYPOGRAPHY */
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/action/EvaluateAction.java b/spring-webflow/src/main/java/org/springframework/webflow/action/EvaluateAction.java
index 0b03879c..63c6bb31 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/action/EvaluateAction.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/action/EvaluateAction.java
@@ -1,113 +1,113 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.action;
-
-import org.springframework.binding.expression.Expression;
-import org.springframework.core.style.ToStringCreator;
-import org.springframework.util.Assert;
-import org.springframework.webflow.execution.Action;
-import org.springframework.webflow.execution.ActionExecutor;
-import org.springframework.webflow.execution.Event;
-import org.springframework.webflow.execution.RequestContext;
-
-/**
- * An action that evaluates an expression and optionally exposes its result.
- *
- * Delegates to a {@link ResultEventFactory} to determine how to map the evaluation result to an action outcome
- * {@link Event}.
- *
- * @see Expression
- * @see ResultEventFactory
- *
- * @author Keith Donald
- * @author Jeremy Grelle
- */
-public class EvaluateAction extends AbstractAction {
-
- /**
- * The expression to evaluate when this action is invoked. Required.
- */
- private Expression expression;
-
- /**
- * The expression to evaluate to set the result of the action. Optional.
- */
- private Expression resultExpression;
-
- /**
- * The selector for the factory that will create the action result event callers can respond to.
- */
- private ResultEventFactory resultEventFactory;
-
- /**
- * Create a new evaluate action.
- * @param expression the expression to evaluate (required)
- * @param resultExpression the expression to evaluate the result (optional)
- */
- public EvaluateAction(Expression expression, Expression resultExpression) {
- init(expression, resultExpression, null);
- }
-
- /**
- * Create a new evaluate action.
- * @param expression the expression to evaluate (required)
- * @param resultExpression the strategy for how the expression result will be exposed to the flow (optional)
- * @param resultEventFactory the factory that will map the evaluation result to a Web Flow event (optional)
- */
- public EvaluateAction(Expression expression, Expression resultExpression, ResultEventFactory resultEventFactory) {
- init(expression, resultExpression, resultEventFactory);
- }
-
- protected Event doExecute(RequestContext context) throws Exception {
- Object result = expression.getValue(context);
- if (result instanceof Action) {
- return ActionExecutor.execute((Action) result, context);
- } else {
- if (resultExpression != null) {
- resultExpression.setValue(context, result);
- }
- return resultEventFactory.createResultEvent(this, result, context);
- }
- }
-
- public String toString() {
- return new ToStringCreator(this).append("expression", expression).append("resultExpression", resultExpression)
- .toString();
- }
-
- // internal helpers
-
- private void init(Expression expression, Expression resultExpression, ResultEventFactory resultEventFactory) {
- Assert.notNull(expression, "The expression this action should evaluate is required");
- this.expression = expression;
- this.resultExpression = resultExpression;
- this.resultEventFactory = resultEventFactory != null ? resultEventFactory : new DefaultResultEventFactory();
- }
-
- /**
- * Default implementation that uses the ResultEventFactorySelector helper.
- * @author Keith Donald
- */
- private class DefaultResultEventFactory implements ResultEventFactory {
-
- private ResultEventFactorySelector selector = new ResultEventFactorySelector();
-
- public Event createResultEvent(Object source, Object resultObject, RequestContext context) {
- return selector.forResult(resultObject).createResultEvent(source, resultObject, context);
- }
- }
-
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.action;
+
+import org.springframework.binding.expression.Expression;
+import org.springframework.core.style.ToStringCreator;
+import org.springframework.util.Assert;
+import org.springframework.webflow.execution.Action;
+import org.springframework.webflow.execution.ActionExecutor;
+import org.springframework.webflow.execution.Event;
+import org.springframework.webflow.execution.RequestContext;
+
+/**
+ * An action that evaluates an expression and optionally exposes its result.
+ *
+ * Delegates to a {@link ResultEventFactory} to determine how to map the evaluation result to an action outcome
+ * {@link Event}.
+ *
+ * @see Expression
+ * @see ResultEventFactory
+ *
+ * @author Keith Donald
+ * @author Jeremy Grelle
+ */
+public class EvaluateAction extends AbstractAction {
+
+ /**
+ * The expression to evaluate when this action is invoked. Required.
+ */
+ private Expression expression;
+
+ /**
+ * The expression to evaluate to set the result of the action. Optional.
+ */
+ private Expression resultExpression;
+
+ /**
+ * The selector for the factory that will create the action result event callers can respond to.
+ */
+ private ResultEventFactory resultEventFactory;
+
+ /**
+ * Create a new evaluate action.
+ * @param expression the expression to evaluate (required)
+ * @param resultExpression the expression to evaluate the result (optional)
+ */
+ public EvaluateAction(Expression expression, Expression resultExpression) {
+ init(expression, resultExpression, null);
+ }
+
+ /**
+ * Create a new evaluate action.
+ * @param expression the expression to evaluate (required)
+ * @param resultExpression the strategy for how the expression result will be exposed to the flow (optional)
+ * @param resultEventFactory the factory that will map the evaluation result to a Web Flow event (optional)
+ */
+ public EvaluateAction(Expression expression, Expression resultExpression, ResultEventFactory resultEventFactory) {
+ init(expression, resultExpression, resultEventFactory);
+ }
+
+ protected Event doExecute(RequestContext context) throws Exception {
+ Object result = expression.getValue(context);
+ if (result instanceof Action) {
+ return ActionExecutor.execute((Action) result, context);
+ } else {
+ if (resultExpression != null) {
+ resultExpression.setValue(context, result);
+ }
+ return resultEventFactory.createResultEvent(this, result, context);
+ }
+ }
+
+ public String toString() {
+ return new ToStringCreator(this).append("expression", expression).append("resultExpression", resultExpression)
+ .toString();
+ }
+
+ // internal helpers
+
+ private void init(Expression expression, Expression resultExpression, ResultEventFactory resultEventFactory) {
+ Assert.notNull(expression, "The expression this action should evaluate is required");
+ this.expression = expression;
+ this.resultExpression = resultExpression;
+ this.resultEventFactory = resultEventFactory != null ? resultEventFactory : new DefaultResultEventFactory();
+ }
+
+ /**
+ * Default implementation that uses the ResultEventFactorySelector helper.
+ * @author Keith Donald
+ */
+ private class DefaultResultEventFactory implements ResultEventFactory {
+
+ private ResultEventFactorySelector selector = new ResultEventFactorySelector();
+
+ public Event createResultEvent(Object source, Object resultObject, RequestContext context) {
+ return selector.forResult(resultObject).createResultEvent(source, resultObject, context);
+ }
+ }
+
}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/action/EventFactorySupport.java b/spring-webflow/src/main/java/org/springframework/webflow/action/EventFactorySupport.java
index e49bda83..0d7f1573 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/action/EventFactorySupport.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/action/EventFactorySupport.java
@@ -1,257 +1,257 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.action;
-
-import org.springframework.webflow.core.collection.AttributeMap;
-import org.springframework.webflow.core.collection.CollectionUtils;
-import org.springframework.webflow.execution.Event;
-
-/**
- * A convenience support class assisting in the creation of {@link Event} objects.
- *
- * This class can be used as a simple utility class when you need to create common event objects. Alternatively you
- * could extend it as a base support class when creating custom event factories.
- *
- * @author Keith Donald
- * @author Erwin Vervaet
- */
-public class EventFactorySupport {
-
- /**
- * The default 'success' result event identifier ("success").
- */
- private static final String SUCCESS_EVENT_ID = "success";
-
- /**
- * The default 'error' result event identifier ("error").
- */
- private static final String ERROR_EVENT_ID = "error";
-
- /**
- * The default 'yes' result event identifier ("yes").
- */
- private static final String YES_EVENT_ID = "yes";
-
- /**
- * The default 'no' result event identifier ("no").
- */
- private static final String NO_EVENT_ID = "no";
-
- /**
- * The default 'null' result event identifier ("null").
- */
- private static final String NULL_EVENT_ID = "null";
-
- /**
- * The default 'exception' event attribute name ("exception").
- */
- private static final String EXCEPTION_ATTRIBUTE_NAME = "exception";
-
- /**
- * The default 'result' event attribute name ("result").
- */
- private static final String RESULT_ATTRIBUTE_NAME = "result";
-
- /**
- * The success event identifier.
- */
- private String successEventId = SUCCESS_EVENT_ID;
-
- /**
- * The error event identifier.
- */
- private String errorEventId = ERROR_EVENT_ID;
-
- /**
- * The yes event identifier.
- */
- private String yesEventId = YES_EVENT_ID;
-
- /**
- * The no event identifier.
- */
- private String noEventId = NO_EVENT_ID;
-
- /**
- * The null event identifier.
- */
- private String nullEventId = NULL_EVENT_ID;
-
- /**
- * The exception event attribute name.
- */
- private String exceptionAttributeName = EXCEPTION_ATTRIBUTE_NAME;
-
- /**
- * The result event attribute name.
- */
- private String resultAttributeName = RESULT_ATTRIBUTE_NAME;
-
- public String getSuccessEventId() {
- return successEventId;
- }
-
- public void setSuccessEventId(String successEventId) {
- this.successEventId = successEventId;
- }
-
- public String getErrorEventId() {
- return errorEventId;
- }
-
- public void setErrorEventId(String errorEventId) {
- this.errorEventId = errorEventId;
- }
-
- public String getYesEventId() {
- return yesEventId;
- }
-
- public void setYesEventId(String yesEventId) {
- this.yesEventId = yesEventId;
- }
-
- public String getNoEventId() {
- return noEventId;
- }
-
- public void setNoEventId(String noEventId) {
- this.noEventId = noEventId;
- }
-
- public String getNullEventId() {
- return nullEventId;
- }
-
- public void setNullEventId(String nullEventId) {
- this.nullEventId = nullEventId;
- }
-
- public String getExceptionAttributeName() {
- return exceptionAttributeName;
- }
-
- public void setExceptionAttributeName(String exceptionAttributeName) {
- this.exceptionAttributeName = exceptionAttributeName;
- }
-
- public String getResultAttributeName() {
- return resultAttributeName;
- }
-
- public void setResultAttributeName(String resultAttributeName) {
- this.resultAttributeName = resultAttributeName;
- }
-
- /**
- * Returns a "success" event.
- * @param source the source of the event
- */
- public Event success(Object source) {
- return event(source, getSuccessEventId());
- }
-
- /**
- * Returns a "success" event with the provided result object as an attribute. The result object is identified by the
- * attribute name {@link #getResultAttributeName()}.
- * @param source the source of the event
- * @param result the action success result
- */
- public Event success(Object source, Object result) {
- return event(source, getSuccessEventId(), getResultAttributeName(), result);
- }
-
- /**
- * Returns an "error" event.
- * @param source the source of the event
- */
- public Event error(Object source) {
- return event(source, getErrorEventId());
- }
-
- /**
- * Returns an "error" event caused by the provided exception.
- * @param source the source of the event
- * @param e the exception that caused the error event, to be put as an event attribute under the name
- * {@link #getExceptionAttributeName()}
- */
- public Event error(Object source, Exception e) {
- return event(source, getErrorEventId(), getExceptionAttributeName(), e);
- }
-
- /**
- * Returns a "yes" event.
- * @param source the source of the event
- */
- public Event yes(Object source) {
- return event(source, getYesEventId());
- }
-
- /**
- * Returns a "no" result event.
- * @param source the source of the event
- */
- public Event no(Object source) {
- return event(source, getNoEventId());
- }
-
- /**
- * Returns an event to communicate an occurrence of a boolean expression.
- * @param source the source of the event
- * @param booleanResult the boolean
- * @return yes or no
- */
- public Event event(Object source, boolean booleanResult) {
- if (booleanResult) {
- return yes(source);
- } else {
- return no(source);
- }
- }
-
- /**
- * Returns a event with the specified identifier.
- * @param source the source of the event
- * @param eventId the result event identifier
- * @return the event
- */
- public Event event(Object source, String eventId) {
- return new Event(source, eventId, null);
- }
-
- /**
- * Returns a event with the specified identifier and the specified set of attributes.
- * @param source the source of the event
- * @param eventId the result event identifier
- * @param attributes the event payload attributes
- * @return the event
- */
- public Event event(Object source, String eventId, AttributeMap attributes) {
- return new Event(source, eventId, attributes);
- }
-
- /**
- * Returns a result event with the specified identifier and a single attribute.
- * @param source the source of the event
- * @param eventId the result id
- * @param attributeName the attribute name
- * @param attributeValue the attribute value
- * @return the event
- */
- public Event event(Object source, String eventId, String attributeName, Object attributeValue) {
- return new Event(source, eventId, CollectionUtils.singleEntryMap(attributeName, attributeValue));
- }
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.action;
+
+import org.springframework.webflow.core.collection.AttributeMap;
+import org.springframework.webflow.core.collection.CollectionUtils;
+import org.springframework.webflow.execution.Event;
+
+/**
+ * A convenience support class assisting in the creation of {@link Event} objects.
+ *
+ * This class can be used as a simple utility class when you need to create common event objects. Alternatively you
+ * could extend it as a base support class when creating custom event factories.
+ *
+ * @author Keith Donald
+ * @author Erwin Vervaet
+ */
+public class EventFactorySupport {
+
+ /**
+ * The default 'success' result event identifier ("success").
+ */
+ private static final String SUCCESS_EVENT_ID = "success";
+
+ /**
+ * The default 'error' result event identifier ("error").
+ */
+ private static final String ERROR_EVENT_ID = "error";
+
+ /**
+ * The default 'yes' result event identifier ("yes").
+ */
+ private static final String YES_EVENT_ID = "yes";
+
+ /**
+ * The default 'no' result event identifier ("no").
+ */
+ private static final String NO_EVENT_ID = "no";
+
+ /**
+ * The default 'null' result event identifier ("null").
+ */
+ private static final String NULL_EVENT_ID = "null";
+
+ /**
+ * The default 'exception' event attribute name ("exception").
+ */
+ private static final String EXCEPTION_ATTRIBUTE_NAME = "exception";
+
+ /**
+ * The default 'result' event attribute name ("result").
+ */
+ private static final String RESULT_ATTRIBUTE_NAME = "result";
+
+ /**
+ * The success event identifier.
+ */
+ private String successEventId = SUCCESS_EVENT_ID;
+
+ /**
+ * The error event identifier.
+ */
+ private String errorEventId = ERROR_EVENT_ID;
+
+ /**
+ * The yes event identifier.
+ */
+ private String yesEventId = YES_EVENT_ID;
+
+ /**
+ * The no event identifier.
+ */
+ private String noEventId = NO_EVENT_ID;
+
+ /**
+ * The null event identifier.
+ */
+ private String nullEventId = NULL_EVENT_ID;
+
+ /**
+ * The exception event attribute name.
+ */
+ private String exceptionAttributeName = EXCEPTION_ATTRIBUTE_NAME;
+
+ /**
+ * The result event attribute name.
+ */
+ private String resultAttributeName = RESULT_ATTRIBUTE_NAME;
+
+ public String getSuccessEventId() {
+ return successEventId;
+ }
+
+ public void setSuccessEventId(String successEventId) {
+ this.successEventId = successEventId;
+ }
+
+ public String getErrorEventId() {
+ return errorEventId;
+ }
+
+ public void setErrorEventId(String errorEventId) {
+ this.errorEventId = errorEventId;
+ }
+
+ public String getYesEventId() {
+ return yesEventId;
+ }
+
+ public void setYesEventId(String yesEventId) {
+ this.yesEventId = yesEventId;
+ }
+
+ public String getNoEventId() {
+ return noEventId;
+ }
+
+ public void setNoEventId(String noEventId) {
+ this.noEventId = noEventId;
+ }
+
+ public String getNullEventId() {
+ return nullEventId;
+ }
+
+ public void setNullEventId(String nullEventId) {
+ this.nullEventId = nullEventId;
+ }
+
+ public String getExceptionAttributeName() {
+ return exceptionAttributeName;
+ }
+
+ public void setExceptionAttributeName(String exceptionAttributeName) {
+ this.exceptionAttributeName = exceptionAttributeName;
+ }
+
+ public String getResultAttributeName() {
+ return resultAttributeName;
+ }
+
+ public void setResultAttributeName(String resultAttributeName) {
+ this.resultAttributeName = resultAttributeName;
+ }
+
+ /**
+ * Returns a "success" event.
+ * @param source the source of the event
+ */
+ public Event success(Object source) {
+ return event(source, getSuccessEventId());
+ }
+
+ /**
+ * Returns a "success" event with the provided result object as an attribute. The result object is identified by the
+ * attribute name {@link #getResultAttributeName()}.
+ * @param source the source of the event
+ * @param result the action success result
+ */
+ public Event success(Object source, Object result) {
+ return event(source, getSuccessEventId(), getResultAttributeName(), result);
+ }
+
+ /**
+ * Returns an "error" event.
+ * @param source the source of the event
+ */
+ public Event error(Object source) {
+ return event(source, getErrorEventId());
+ }
+
+ /**
+ * Returns an "error" event caused by the provided exception.
+ * @param source the source of the event
+ * @param e the exception that caused the error event, to be put as an event attribute under the name
+ * {@link #getExceptionAttributeName()}
+ */
+ public Event error(Object source, Exception e) {
+ return event(source, getErrorEventId(), getExceptionAttributeName(), e);
+ }
+
+ /**
+ * Returns a "yes" event.
+ * @param source the source of the event
+ */
+ public Event yes(Object source) {
+ return event(source, getYesEventId());
+ }
+
+ /**
+ * Returns a "no" result event.
+ * @param source the source of the event
+ */
+ public Event no(Object source) {
+ return event(source, getNoEventId());
+ }
+
+ /**
+ * Returns an event to communicate an occurrence of a boolean expression.
+ * @param source the source of the event
+ * @param booleanResult the boolean
+ * @return yes or no
+ */
+ public Event event(Object source, boolean booleanResult) {
+ if (booleanResult) {
+ return yes(source);
+ } else {
+ return no(source);
+ }
+ }
+
+ /**
+ * Returns a event with the specified identifier.
+ * @param source the source of the event
+ * @param eventId the result event identifier
+ * @return the event
+ */
+ public Event event(Object source, String eventId) {
+ return new Event(source, eventId, null);
+ }
+
+ /**
+ * Returns a event with the specified identifier and the specified set of attributes.
+ * @param source the source of the event
+ * @param eventId the result event identifier
+ * @param attributes the event payload attributes
+ * @return the event
+ */
+ public Event event(Object source, String eventId, AttributeMap attributes) {
+ return new Event(source, eventId, attributes);
+ }
+
+ /**
+ * Returns a result event with the specified identifier and a single attribute.
+ * @param source the source of the event
+ * @param eventId the result id
+ * @param attributeName the attribute name
+ * @param attributeValue the attribute value
+ * @return the event
+ */
+ public Event event(Object source, String eventId, String attributeName, Object attributeValue) {
+ return new Event(source, eventId, CollectionUtils.singleEntryMap(attributeName, attributeValue));
+ }
}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/action/RenderAction.java b/spring-webflow/src/main/java/org/springframework/webflow/action/RenderAction.java
index f21b9554..c3ab487b 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/action/RenderAction.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/action/RenderAction.java
@@ -1,62 +1,62 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.action;
-
-import org.springframework.binding.expression.Expression;
-import org.springframework.core.style.ToStringCreator;
-import org.springframework.webflow.execution.Event;
-import org.springframework.webflow.execution.RequestContext;
-import org.springframework.webflow.execution.View;
-
-/**
- * An action that sets a special attribute that views use to render partial views called "fragments", instead of the
- * entire view.
- *
- * @author Keith Donald
- */
-public class RenderAction extends AbstractAction {
-
- /**
- * The expression for setting the scoped attribute value.
- */
- private Expression[] fragmentExpressions;
-
- /**
- * Creates a new render action.
- * @param fragmentExpressions the set of expressions to resolve the view fragments to render
- */
- public RenderAction(Expression... fragmentExpressions) {
- if (fragmentExpressions == null || fragmentExpressions.length == 0) {
- throw new IllegalArgumentException(
- "You must provide at least one fragment expression to this render action");
- }
- this.fragmentExpressions = fragmentExpressions;
- }
-
- protected Event doExecute(RequestContext context) throws Exception {
- String[] fragments = new String[fragmentExpressions.length];
- for (int i = 0; i < fragmentExpressions.length; i++) {
- Expression exp = fragmentExpressions[i];
- fragments[i] = (String) exp.getValue(context);
- }
- context.getFlashScope().put(View.RENDER_FRAGMENTS_ATTRIBUTE, fragments);
- return success();
- }
-
- public String toString() {
- return new ToStringCreator(this).append("fragments", fragmentExpressions).toString();
- }
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.action;
+
+import org.springframework.binding.expression.Expression;
+import org.springframework.core.style.ToStringCreator;
+import org.springframework.webflow.execution.Event;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.View;
+
+/**
+ * An action that sets a special attribute that views use to render partial views called "fragments", instead of the
+ * entire view.
+ *
+ * @author Keith Donald
+ */
+public class RenderAction extends AbstractAction {
+
+ /**
+ * The expression for setting the scoped attribute value.
+ */
+ private Expression[] fragmentExpressions;
+
+ /**
+ * Creates a new render action.
+ * @param fragmentExpressions the set of expressions to resolve the view fragments to render
+ */
+ public RenderAction(Expression... fragmentExpressions) {
+ if (fragmentExpressions == null || fragmentExpressions.length == 0) {
+ throw new IllegalArgumentException(
+ "You must provide at least one fragment expression to this render action");
+ }
+ this.fragmentExpressions = fragmentExpressions;
+ }
+
+ protected Event doExecute(RequestContext context) throws Exception {
+ String[] fragments = new String[fragmentExpressions.length];
+ for (int i = 0; i < fragmentExpressions.length; i++) {
+ Expression exp = fragmentExpressions[i];
+ fragments[i] = (String) exp.getValue(context);
+ }
+ context.getFlashScope().put(View.RENDER_FRAGMENTS_ATTRIBUTE, fragments);
+ return success();
+ }
+
+ public String toString() {
+ return new ToStringCreator(this).append("fragments", fragmentExpressions).toString();
+ }
}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/action/ResultEventFactorySelector.java b/spring-webflow/src/main/java/org/springframework/webflow/action/ResultEventFactorySelector.java
index 49a2d15d..90b332ba 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/action/ResultEventFactorySelector.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/action/ResultEventFactorySelector.java
@@ -1,77 +1,77 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.action;
-
-import java.lang.reflect.Method;
-
-/**
- * Helper that selects the {@link ResultEventFactory} to use for a particular result object.
- *
- * @see EvaluateAction
- *
- * @author Keith Donald
- */
-public class ResultEventFactorySelector {
-
- /**
- * The event factory instance for mapping a return value to a success event.
- */
- private SuccessEventFactory successEventFactory = new SuccessEventFactory();
-
- /**
- * The event factory instance for mapping a result object to an event, using the type of the result object as the
- * mapping criteria.
- */
- private ResultObjectBasedEventFactory resultObjectBasedEventFactory = new ResultObjectBasedEventFactory();
-
- /**
- * Select the appropriate result event factory for attempts to invoke the given method.
- * @param method the method
- * @return the result event factory
- */
- public ResultEventFactory forMethod(Method method) {
- return forType(method.getReturnType());
- }
-
- /**
- * Select the appropriate result event factory for the given result.
- * @param result the result
- * @return the result event factory
- */
- public ResultEventFactory forResult(Object result) {
- if (result == null) {
- return successEventFactory;
- } else {
- return forType(result.getClass());
- }
- }
-
- /**
- * Select the appropriate result event factory for given result type. This implementation returns
- * {@link ResultObjectBasedEventFactory} if the type is
- * {@link ResultObjectBasedEventFactory#isMappedValueType(Class) mapped} by that result event factory, otherwise
- * {@link SuccessEventFactory} is returned.
- * @param resultType the result type
- * @return the result event factory
- */
- protected ResultEventFactory forType(Class> resultType) {
- if (resultObjectBasedEventFactory.isMappedValueType(resultType)) {
- return resultObjectBasedEventFactory;
- } else {
- return successEventFactory;
- }
- }
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.action;
+
+import java.lang.reflect.Method;
+
+/**
+ * Helper that selects the {@link ResultEventFactory} to use for a particular result object.
+ *
+ * @see EvaluateAction
+ *
+ * @author Keith Donald
+ */
+public class ResultEventFactorySelector {
+
+ /**
+ * The event factory instance for mapping a return value to a success event.
+ */
+ private SuccessEventFactory successEventFactory = new SuccessEventFactory();
+
+ /**
+ * The event factory instance for mapping a result object to an event, using the type of the result object as the
+ * mapping criteria.
+ */
+ private ResultObjectBasedEventFactory resultObjectBasedEventFactory = new ResultObjectBasedEventFactory();
+
+ /**
+ * Select the appropriate result event factory for attempts to invoke the given method.
+ * @param method the method
+ * @return the result event factory
+ */
+ public ResultEventFactory forMethod(Method method) {
+ return forType(method.getReturnType());
+ }
+
+ /**
+ * Select the appropriate result event factory for the given result.
+ * @param result the result
+ * @return the result event factory
+ */
+ public ResultEventFactory forResult(Object result) {
+ if (result == null) {
+ return successEventFactory;
+ } else {
+ return forType(result.getClass());
+ }
+ }
+
+ /**
+ * Select the appropriate result event factory for given result type. This implementation returns
+ * {@link ResultObjectBasedEventFactory} if the type is
+ * {@link ResultObjectBasedEventFactory#isMappedValueType(Class) mapped} by that result event factory, otherwise
+ * {@link SuccessEventFactory} is returned.
+ * @param resultType the result type
+ * @return the result event factory
+ */
+ protected ResultEventFactory forType(Class> resultType) {
+ if (resultObjectBasedEventFactory.isMappedValueType(resultType)) {
+ return resultObjectBasedEventFactory;
+ } else {
+ return successEventFactory;
+ }
+ }
}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/action/SetAction.java b/spring-webflow/src/main/java/org/springframework/webflow/action/SetAction.java
index 4e396f81..596c49a4 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/action/SetAction.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/action/SetAction.java
@@ -1,64 +1,64 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.action;
-
-import org.springframework.binding.expression.Expression;
-import org.springframework.core.style.ToStringCreator;
-import org.springframework.util.Assert;
-import org.springframework.webflow.execution.Event;
-import org.springframework.webflow.execution.RequestContext;
-import org.springframework.webflow.execution.ScopeType;
-
-/**
- * An action that sets an attribute in a {@link ScopeType scope} when executed. Always returns the "success" event.
- *
- * @author Keith Donald
- */
-public class SetAction extends AbstractAction {
-
- /**
- * The expression for setting the scoped attribute value.
- */
- private Expression nameExpression;
-
- /**
- * The expression for resolving the scoped attribute value.
- */
- private Expression valueExpression;
-
- /**
- * Creates a new set attribute action.
- * @param nameExpression the name of the property to set (required)
- * @param valueExpression the expression to obtain the new property value (required) expected
- */
- public SetAction(Expression nameExpression, Expression valueExpression) {
- Assert.notNull(nameExpression, "The name expression is required");
- Assert.notNull(valueExpression, "The value expression is required");
- this.nameExpression = nameExpression;
- this.valueExpression = valueExpression;
- }
-
- protected Event doExecute(RequestContext context) throws Exception {
- Object value = valueExpression.getValue(context);
- nameExpression.setValue(context, value);
- return success();
- }
-
- public String toString() {
- return new ToStringCreator(this).append("name", nameExpression).append("value", valueExpression).toString();
- }
-
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.action;
+
+import org.springframework.binding.expression.Expression;
+import org.springframework.core.style.ToStringCreator;
+import org.springframework.util.Assert;
+import org.springframework.webflow.execution.Event;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.ScopeType;
+
+/**
+ * An action that sets an attribute in a {@link ScopeType scope} when executed. Always returns the "success" event.
+ *
+ * @author Keith Donald
+ */
+public class SetAction extends AbstractAction {
+
+ /**
+ * The expression for setting the scoped attribute value.
+ */
+ private Expression nameExpression;
+
+ /**
+ * The expression for resolving the scoped attribute value.
+ */
+ private Expression valueExpression;
+
+ /**
+ * Creates a new set attribute action.
+ * @param nameExpression the name of the property to set (required)
+ * @param valueExpression the expression to obtain the new property value (required) expected
+ */
+ public SetAction(Expression nameExpression, Expression valueExpression) {
+ Assert.notNull(nameExpression, "The name expression is required");
+ Assert.notNull(valueExpression, "The value expression is required");
+ this.nameExpression = nameExpression;
+ this.valueExpression = valueExpression;
+ }
+
+ protected Event doExecute(RequestContext context) throws Exception {
+ Object value = valueExpression.getValue(context);
+ nameExpression.setValue(context, value);
+ return success();
+ }
+
+ public String toString() {
+ return new ToStringCreator(this).append("name", nameExpression).append("value", valueExpression).toString();
+ }
+
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/config/FlowExecutorFactoryBean.java b/spring-webflow/src/main/java/org/springframework/webflow/config/FlowExecutorFactoryBean.java
index c705556b..2accefcc 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/config/FlowExecutorFactoryBean.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/config/FlowExecutorFactoryBean.java
@@ -1,246 +1,246 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.config;
-
-import java.util.Set;
-
-import org.springframework.beans.factory.BeanClassLoaderAware;
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.binding.convert.ConversionExecutor;
-import org.springframework.binding.convert.ConversionService;
-import org.springframework.binding.convert.service.DefaultConversionService;
-import org.springframework.util.Assert;
-import org.springframework.util.ClassUtils;
-import org.springframework.webflow.conversation.ConversationManager;
-import org.springframework.webflow.conversation.impl.SessionBindingConversationManager;
-import org.springframework.webflow.core.collection.AttributeMap;
-import org.springframework.webflow.core.collection.LocalAttributeMap;
-import org.springframework.webflow.core.collection.MutableAttributeMap;
-import org.springframework.webflow.definition.registry.FlowDefinitionLocator;
-import org.springframework.webflow.definition.registry.FlowDefinitionRegistry;
-import org.springframework.webflow.engine.impl.FlowExecutionImplFactory;
-import org.springframework.webflow.execution.FlowExecutionFactory;
-import org.springframework.webflow.execution.factory.FlowExecutionListenerLoader;
-import org.springframework.webflow.execution.repository.FlowExecutionRepository;
-import org.springframework.webflow.execution.repository.impl.DefaultFlowExecutionRepository;
-import org.springframework.webflow.execution.repository.snapshot.FlowExecutionSnapshotFactory;
-import org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshotFactory;
-import org.springframework.webflow.execution.repository.snapshot.SimpleFlowExecutionSnapshotFactory;
-import org.springframework.webflow.executor.FlowExecutor;
-import org.springframework.webflow.executor.FlowExecutorImpl;
-
-/**
- * This factory encapsulates the construction and assembly of a {@link FlowExecutor}, including the provision of its
- * {@link FlowExecutionRepository} strategy. As a FactoryBean, this class has been designed for use as a
- * Spring managed bean.
- *
- * The definition locator property is required, all other properties are optional.
- *
- * @author Keith Donald
- * @author Erwin Vervaet
- */
-class FlowExecutorFactoryBean implements FactoryBean, BeanClassLoaderAware, InitializingBean {
-
- private static final String ALWAYS_REDIRECT_ON_PAUSE = "alwaysRedirectOnPause";
-
- private static final String REDIRECT_IN_SAME_STATE = "redirectInSameState";
-
- private FlowDefinitionLocator flowDefinitionLocator;
-
- private Integer maxFlowExecutions;
-
- private Integer maxFlowExecutionSnapshots;
-
- private Set flowExecutionAttributes;
-
- private FlowExecutionListenerLoader flowExecutionListenerLoader;
-
- private ConversationManager conversationManager;
-
- private ConversionService conversionService;
-
- private FlowExecutor flowExecutor;
-
- private ClassLoader classLoader;
-
- /**
- * Sets the flow definition locator that will locate flow definitions needed for execution. Typically also a
- * {@link FlowDefinitionRegistry}. Required.
- * @param flowDefinitionLocator the flow definition locator (registry)
- */
- public void setFlowDefinitionLocator(FlowDefinitionLocator flowDefinitionLocator) {
- this.flowDefinitionLocator = flowDefinitionLocator;
- }
-
- /**
- * Set the maximum number of allowed flow executions allowed per user.
- */
- public void setMaxFlowExecutions(int maxFlowExecutions) {
- this.maxFlowExecutions = maxFlowExecutions;
- }
-
- /**
- * Set the maximum number of history snapshots allowed per flow execution.
- */
- public void setMaxFlowExecutionSnapshots(int maxFlowExecutionSnapshots) {
- this.maxFlowExecutionSnapshots = maxFlowExecutionSnapshots;
- }
-
- /**
- * Sets the system attributes that apply to flow executions launched by the executor created by this factory.
- * Execution attributes may affect flow execution behavior.
- * @param flowExecutionAttributes the flow execution system attributes
- */
- public void setFlowExecutionAttributes(Set flowExecutionAttributes) {
- this.flowExecutionAttributes = flowExecutionAttributes;
- }
-
- /**
- * Sets the strategy for loading the listeners that will observe executions of a flow definition. Allows full
- * control over what listeners should apply to executions of a flow definition launched by the executor created by
- * this factory.
- */
- public void setFlowExecutionListenerLoader(FlowExecutionListenerLoader flowExecutionListenerLoader) {
- this.flowExecutionListenerLoader = flowExecutionListenerLoader;
- }
-
- /**
- * Sets the service type that manages conversations and effectively controls how state is stored physically when a
- * flow execution is paused.
- */
- public void setConversationManager(ConversationManager conversationManager) {
- this.conversationManager = conversationManager;
- }
-
- // implement BeanClassLoaderAware
-
- public void setBeanClassLoader(ClassLoader classLoader) {
- this.classLoader = classLoader;
- }
-
- // implementing InitializingBean
-
- public void afterPropertiesSet() throws Exception {
- Assert.notNull(flowDefinitionLocator, "The flow definition locator property is required");
- if (conversionService == null) {
- conversionService = new DefaultConversionService();
- }
- MutableAttributeMap executionAttributes = createFlowExecutionAttributes();
- FlowExecutionImplFactory executionFactory = createFlowExecutionFactory(executionAttributes);
- DefaultFlowExecutionRepository executionRepository = createFlowExecutionRepository(executionFactory);
- executionFactory.setExecutionKeyFactory(executionRepository);
- flowExecutor = new FlowExecutorImpl(flowDefinitionLocator, executionFactory, executionRepository);
- }
-
- // implementing FactoryBean
-
- public Class> getObjectType() {
- return FlowExecutor.class;
- }
-
- public boolean isSingleton() {
- return true;
- }
-
- public FlowExecutor getObject() throws Exception {
- return flowExecutor;
- }
-
- private MutableAttributeMap createFlowExecutionAttributes() {
- LocalAttributeMap executionAttributes = new LocalAttributeMap<>();
- if (flowExecutionAttributes != null) {
- for (FlowElementAttribute attribute : flowExecutionAttributes) {
- executionAttributes.put(attribute.getName(), getConvertedValue(attribute));
- }
- }
- putDefaultFlowExecutionAttributes(executionAttributes);
- return executionAttributes;
- }
-
- private void putDefaultFlowExecutionAttributes(LocalAttributeMap executionAttributes) {
- if (!executionAttributes.contains(ALWAYS_REDIRECT_ON_PAUSE)) {
- executionAttributes.put(ALWAYS_REDIRECT_ON_PAUSE, true);
- }
- if (!executionAttributes.contains(REDIRECT_IN_SAME_STATE)) {
- executionAttributes.put(REDIRECT_IN_SAME_STATE, true);
- }
- }
-
- private DefaultFlowExecutionRepository createFlowExecutionRepository(FlowExecutionFactory executionFactory) {
- ConversationManager conversationManager = createConversationManager();
- FlowExecutionSnapshotFactory snapshotFactory = createFlowExecutionSnapshotFactory(executionFactory);
- DefaultFlowExecutionRepository rep = new DefaultFlowExecutionRepository(conversationManager, snapshotFactory);
- if (maxFlowExecutionSnapshots != null) {
- rep.setMaxSnapshots(maxFlowExecutionSnapshots);
- }
- return rep;
- }
-
- private ConversationManager createConversationManager() {
- if (conversationManager == null) {
- conversationManager = new SessionBindingConversationManager();
- if (maxFlowExecutions != null) {
- ((SessionBindingConversationManager) conversationManager).setMaxConversations(maxFlowExecutions);
- }
- }
- return this.conversationManager;
- }
-
- private FlowExecutionSnapshotFactory createFlowExecutionSnapshotFactory(FlowExecutionFactory executionFactory) {
- if (maxFlowExecutionSnapshots != null && maxFlowExecutionSnapshots == 0) {
- maxFlowExecutionSnapshots = 1;
- return new SimpleFlowExecutionSnapshotFactory(executionFactory, flowDefinitionLocator);
- } else {
- return new SerializedFlowExecutionSnapshotFactory(executionFactory, flowDefinitionLocator);
- }
- }
-
- private FlowExecutionImplFactory createFlowExecutionFactory(AttributeMap executionAttributes) {
- FlowExecutionImplFactory executionFactory = new FlowExecutionImplFactory();
- executionFactory.setExecutionAttributes(executionAttributes);
- if (flowExecutionListenerLoader != null) {
- executionFactory.setExecutionListenerLoader(flowExecutionListenerLoader);
- }
- return executionFactory;
- }
-
- // utility methods
-
- private Object getConvertedValue(FlowElementAttribute attribute) {
- if (attribute.needsTypeConversion()) {
- Class> targetType = fromStringToClass(attribute.getType());
- ConversionExecutor converter = conversionService.getConversionExecutor(String.class, targetType);
- return converter.execute(attribute.getValue());
- } else {
- return attribute.getValue();
- }
- }
-
- private Class> fromStringToClass(String name) {
- Class> clazz = conversionService.getClassForAlias(name);
- if (clazz != null) {
- return clazz;
- } else {
- try {
- return ClassUtils.forName(name, classLoader);
- } catch (ClassNotFoundException e) {
- throw new IllegalArgumentException("Unable to load class '" + name + "'");
- }
- }
- }
-
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.config;
+
+import java.util.Set;
+
+import org.springframework.beans.factory.BeanClassLoaderAware;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.binding.convert.ConversionExecutor;
+import org.springframework.binding.convert.ConversionService;
+import org.springframework.binding.convert.service.DefaultConversionService;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+import org.springframework.webflow.conversation.ConversationManager;
+import org.springframework.webflow.conversation.impl.SessionBindingConversationManager;
+import org.springframework.webflow.core.collection.AttributeMap;
+import org.springframework.webflow.core.collection.LocalAttributeMap;
+import org.springframework.webflow.core.collection.MutableAttributeMap;
+import org.springframework.webflow.definition.registry.FlowDefinitionLocator;
+import org.springframework.webflow.definition.registry.FlowDefinitionRegistry;
+import org.springframework.webflow.engine.impl.FlowExecutionImplFactory;
+import org.springframework.webflow.execution.FlowExecutionFactory;
+import org.springframework.webflow.execution.factory.FlowExecutionListenerLoader;
+import org.springframework.webflow.execution.repository.FlowExecutionRepository;
+import org.springframework.webflow.execution.repository.impl.DefaultFlowExecutionRepository;
+import org.springframework.webflow.execution.repository.snapshot.FlowExecutionSnapshotFactory;
+import org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshotFactory;
+import org.springframework.webflow.execution.repository.snapshot.SimpleFlowExecutionSnapshotFactory;
+import org.springframework.webflow.executor.FlowExecutor;
+import org.springframework.webflow.executor.FlowExecutorImpl;
+
+/**
+ * This factory encapsulates the construction and assembly of a {@link FlowExecutor}, including the provision of its
+ * {@link FlowExecutionRepository} strategy. As a FactoryBean, this class has been designed for use as a
+ * Spring managed bean.
+ *
+ * The definition locator property is required, all other properties are optional.
+ *
+ * @author Keith Donald
+ * @author Erwin Vervaet
+ */
+class FlowExecutorFactoryBean implements FactoryBean, BeanClassLoaderAware, InitializingBean {
+
+ private static final String ALWAYS_REDIRECT_ON_PAUSE = "alwaysRedirectOnPause";
+
+ private static final String REDIRECT_IN_SAME_STATE = "redirectInSameState";
+
+ private FlowDefinitionLocator flowDefinitionLocator;
+
+ private Integer maxFlowExecutions;
+
+ private Integer maxFlowExecutionSnapshots;
+
+ private Set flowExecutionAttributes;
+
+ private FlowExecutionListenerLoader flowExecutionListenerLoader;
+
+ private ConversationManager conversationManager;
+
+ private ConversionService conversionService;
+
+ private FlowExecutor flowExecutor;
+
+ private ClassLoader classLoader;
+
+ /**
+ * Sets the flow definition locator that will locate flow definitions needed for execution. Typically also a
+ * {@link FlowDefinitionRegistry}. Required.
+ * @param flowDefinitionLocator the flow definition locator (registry)
+ */
+ public void setFlowDefinitionLocator(FlowDefinitionLocator flowDefinitionLocator) {
+ this.flowDefinitionLocator = flowDefinitionLocator;
+ }
+
+ /**
+ * Set the maximum number of allowed flow executions allowed per user.
+ */
+ public void setMaxFlowExecutions(int maxFlowExecutions) {
+ this.maxFlowExecutions = maxFlowExecutions;
+ }
+
+ /**
+ * Set the maximum number of history snapshots allowed per flow execution.
+ */
+ public void setMaxFlowExecutionSnapshots(int maxFlowExecutionSnapshots) {
+ this.maxFlowExecutionSnapshots = maxFlowExecutionSnapshots;
+ }
+
+ /**
+ * Sets the system attributes that apply to flow executions launched by the executor created by this factory.
+ * Execution attributes may affect flow execution behavior.
+ * @param flowExecutionAttributes the flow execution system attributes
+ */
+ public void setFlowExecutionAttributes(Set flowExecutionAttributes) {
+ this.flowExecutionAttributes = flowExecutionAttributes;
+ }
+
+ /**
+ * Sets the strategy for loading the listeners that will observe executions of a flow definition. Allows full
+ * control over what listeners should apply to executions of a flow definition launched by the executor created by
+ * this factory.
+ */
+ public void setFlowExecutionListenerLoader(FlowExecutionListenerLoader flowExecutionListenerLoader) {
+ this.flowExecutionListenerLoader = flowExecutionListenerLoader;
+ }
+
+ /**
+ * Sets the service type that manages conversations and effectively controls how state is stored physically when a
+ * flow execution is paused.
+ */
+ public void setConversationManager(ConversationManager conversationManager) {
+ this.conversationManager = conversationManager;
+ }
+
+ // implement BeanClassLoaderAware
+
+ public void setBeanClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ }
+
+ // implementing InitializingBean
+
+ public void afterPropertiesSet() throws Exception {
+ Assert.notNull(flowDefinitionLocator, "The flow definition locator property is required");
+ if (conversionService == null) {
+ conversionService = new DefaultConversionService();
+ }
+ MutableAttributeMap executionAttributes = createFlowExecutionAttributes();
+ FlowExecutionImplFactory executionFactory = createFlowExecutionFactory(executionAttributes);
+ DefaultFlowExecutionRepository executionRepository = createFlowExecutionRepository(executionFactory);
+ executionFactory.setExecutionKeyFactory(executionRepository);
+ flowExecutor = new FlowExecutorImpl(flowDefinitionLocator, executionFactory, executionRepository);
+ }
+
+ // implementing FactoryBean
+
+ public Class> getObjectType() {
+ return FlowExecutor.class;
+ }
+
+ public boolean isSingleton() {
+ return true;
+ }
+
+ public FlowExecutor getObject() throws Exception {
+ return flowExecutor;
+ }
+
+ private MutableAttributeMap createFlowExecutionAttributes() {
+ LocalAttributeMap executionAttributes = new LocalAttributeMap<>();
+ if (flowExecutionAttributes != null) {
+ for (FlowElementAttribute attribute : flowExecutionAttributes) {
+ executionAttributes.put(attribute.getName(), getConvertedValue(attribute));
+ }
+ }
+ putDefaultFlowExecutionAttributes(executionAttributes);
+ return executionAttributes;
+ }
+
+ private void putDefaultFlowExecutionAttributes(LocalAttributeMap executionAttributes) {
+ if (!executionAttributes.contains(ALWAYS_REDIRECT_ON_PAUSE)) {
+ executionAttributes.put(ALWAYS_REDIRECT_ON_PAUSE, true);
+ }
+ if (!executionAttributes.contains(REDIRECT_IN_SAME_STATE)) {
+ executionAttributes.put(REDIRECT_IN_SAME_STATE, true);
+ }
+ }
+
+ private DefaultFlowExecutionRepository createFlowExecutionRepository(FlowExecutionFactory executionFactory) {
+ ConversationManager conversationManager = createConversationManager();
+ FlowExecutionSnapshotFactory snapshotFactory = createFlowExecutionSnapshotFactory(executionFactory);
+ DefaultFlowExecutionRepository rep = new DefaultFlowExecutionRepository(conversationManager, snapshotFactory);
+ if (maxFlowExecutionSnapshots != null) {
+ rep.setMaxSnapshots(maxFlowExecutionSnapshots);
+ }
+ return rep;
+ }
+
+ private ConversationManager createConversationManager() {
+ if (conversationManager == null) {
+ conversationManager = new SessionBindingConversationManager();
+ if (maxFlowExecutions != null) {
+ ((SessionBindingConversationManager) conversationManager).setMaxConversations(maxFlowExecutions);
+ }
+ }
+ return this.conversationManager;
+ }
+
+ private FlowExecutionSnapshotFactory createFlowExecutionSnapshotFactory(FlowExecutionFactory executionFactory) {
+ if (maxFlowExecutionSnapshots != null && maxFlowExecutionSnapshots == 0) {
+ maxFlowExecutionSnapshots = 1;
+ return new SimpleFlowExecutionSnapshotFactory(executionFactory, flowDefinitionLocator);
+ } else {
+ return new SerializedFlowExecutionSnapshotFactory(executionFactory, flowDefinitionLocator);
+ }
+ }
+
+ private FlowExecutionImplFactory createFlowExecutionFactory(AttributeMap executionAttributes) {
+ FlowExecutionImplFactory executionFactory = new FlowExecutionImplFactory();
+ executionFactory.setExecutionAttributes(executionAttributes);
+ if (flowExecutionListenerLoader != null) {
+ executionFactory.setExecutionListenerLoader(flowExecutionListenerLoader);
+ }
+ return executionFactory;
+ }
+
+ // utility methods
+
+ private Object getConvertedValue(FlowElementAttribute attribute) {
+ if (attribute.needsTypeConversion()) {
+ Class> targetType = fromStringToClass(attribute.getType());
+ ConversionExecutor converter = conversionService.getConversionExecutor(String.class, targetType);
+ return converter.execute(attribute.getValue());
+ } else {
+ return attribute.getValue();
+ }
+ }
+
+ private Class> fromStringToClass(String name) {
+ Class> clazz = conversionService.getClassForAlias(name);
+ if (clazz != null) {
+ return clazz;
+ } else {
+ try {
+ return ClassUtils.forName(name, classLoader);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Unable to load class '" + name + "'");
+ }
+ }
+ }
+
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/config/WebFlowConfigNamespaceHandler.java b/spring-webflow/src/main/java/org/springframework/webflow/config/WebFlowConfigNamespaceHandler.java
index 064f188d..026a6344 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/config/WebFlowConfigNamespaceHandler.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/config/WebFlowConfigNamespaceHandler.java
@@ -1,34 +1,34 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.config;
-
-import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
-
-/**
- * NamespaceHandler for the webflow-config namespace.
- *
- * @author Keith Donald
- * @author Ben Hale
- * @author Jeremy Grelle
- */
-public class WebFlowConfigNamespaceHandler extends NamespaceHandlerSupport {
- public void init() {
- registerBeanDefinitionParser("flow-executor", new FlowExecutorBeanDefinitionParser());
- registerBeanDefinitionParser("flow-execution-listeners", new FlowExecutionListenerLoaderBeanDefinitionParser());
- registerBeanDefinitionParser("flow-registry", new FlowRegistryBeanDefinitionParser());
- registerBeanDefinitionParser("flow-builder-services", new FlowBuilderServicesBeanDefinitionParser());
- }
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.config;
+
+import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
+
+/**
+ * NamespaceHandler for the webflow-config namespace.
+ *
+ * @author Keith Donald
+ * @author Ben Hale
+ * @author Jeremy Grelle
+ */
+public class WebFlowConfigNamespaceHandler extends NamespaceHandlerSupport {
+ public void init() {
+ registerBeanDefinitionParser("flow-executor", new FlowExecutorBeanDefinitionParser());
+ registerBeanDefinitionParser("flow-execution-listeners", new FlowExecutionListenerLoaderBeanDefinitionParser());
+ registerBeanDefinitionParser("flow-registry", new FlowRegistryBeanDefinitionParser());
+ registerBeanDefinitionParser("flow-builder-services", new FlowBuilderServicesBeanDefinitionParser());
+ }
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/context/ExternalContext.java b/spring-webflow/src/main/java/org/springframework/webflow/context/ExternalContext.java
index 507cab2e..5ed7db56 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/context/ExternalContext.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/context/ExternalContext.java
@@ -1,216 +1,216 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.context;
-
-import java.io.Writer;
-import java.security.Principal;
-import java.util.Locale;
-
-import org.springframework.webflow.core.collection.MutableAttributeMap;
-import org.springframework.webflow.core.collection.ParameterMap;
-import org.springframework.webflow.core.collection.SharedAttributeMap;
-
-/**
- * A facade that provides normalized access to an external system that has called into the Spring Web Flow system.
- *
- * This context object provides a normalized interface for internal web flow artifacts to use to reason on and
- * manipulate the state of an external actor calling into SWF to execute flows. It represents the context about a
- * single, external client request to manipulate a flow execution.
- *
- * The design of this interface was inspired by JSF's own ExternalContext abstraction and shares the same name for
- * consistency. If a particular external client type does not support all methods defined by this interface, they can
- * just be implemented as returning an empty map or null.
- *
- * @author Keith Donald
- * @author Erwin Vervaet
- * @author Jeremy Grelle
- * @author Scott Andrews
- */
-public interface ExternalContext {
-
- /**
- * Returns the logical path to the application hosting this external context.
- * @return the context path
- */
- String getContextPath();
-
- /**
- * Provides access to the parameters associated with the user request that led to SWF being called. This map is
- * expected to be immutable and cannot be changed.
- * @return the immutable request parameter map
- */
- ParameterMap getRequestParameterMap();
-
- /**
- * Provides access to the external request attribute map, providing a storage for data local to the current user
- * request and accessible to both internal and external SWF artifacts.
- * @return the mutable request attribute map
- */
- MutableAttributeMap getRequestMap();
-
- /**
- * Provides access to the external session map, providing a storage for data local to the current user session and
- * accessible to both internal and external SWF artifacts.
- * @return the mutable session attribute map
- */
- SharedAttributeMap getSessionMap();
-
- /**
- * Provides access to the global external session map, providing a storage for data globally accross the user
- * session and accessible to both internal and external SWF artifacts.
- *
- * Note: most external context implementations do not distinguish between the concept of a "local" user session
- * scope and a "global" session scope. Otherwise this method returns the same map as calling {@link #getSessionMap()}.
- * @return the mutable global session attribute map
- */
- SharedAttributeMap getGlobalSessionMap();
-
- /**
- * Provides access to the external application map, providing a storage for data local to the current user
- * application and accessible to both internal and external SWF artifacts.
- * @return the mutable application attribute map
- */
- SharedAttributeMap getApplicationMap();
-
- /**
- * Returns true if the current request is an asynchronous Ajax request.
- * @return true if the current request is an Ajax request
- */
- boolean isAjaxRequest();
-
- /**
- * Get a flow execution URL for the execution with the provided key. Typically used by response writers that write
- * out references to the flow execution to support postback on a subsequent request. The URL returned is encoded.
- * @param flowId the flow definition id
- * @param flowExecutionKey the flow execution key
- * @return the flow execution URL
- */
- String getFlowExecutionUrl(String flowId, String flowExecutionKey);
-
- /**
- * Provides access to the user's principal security object.
- * @return the user principal
- */
- Principal getCurrentUser();
-
- /**
- * Returns the client locale.
- * @return the locale
- */
- Locale getLocale();
-
- /**
- * Provides access to the context object for the current environment.
- * @return the environment specific context object
- */
- Object getNativeContext();
-
- /**
- * Provides access to the request object for the current environment.
- * @return the environment specific request object.
- */
- Object getNativeRequest();
-
- /**
- * Provides access to the response object for the current environment.
- * @return the environment specific response object.
- */
- Object getNativeResponse();
-
- /**
- * Get a writer for writing out a response.
- * @return the writer
- * @throws IllegalStateException if the response has completed or is not allowed
- */
- Writer getResponseWriter() throws IllegalStateException;
-
- /**
- * Is a render response allowed to be written for this request? Always return false after a response has been
- * completed. May return false before that to indicate a response is not allowed to be completed.
- * @return true if yes, false otherwise
- */
- boolean isResponseAllowed();
-
- /**
- * Request that a flow execution redirect be performed by the calling environment. Typically called from within a
- * flow execution to request a refresh operation, usually to support "refresh after event processing" behavior.
- * Calling this method also sets responseComplete status to true.
- * @see #isResponseComplete()
- * @throws IllegalStateException if the response has completed
- */
- void requestFlowExecutionRedirect() throws IllegalStateException;
-
- /**
- * Request that a flow definition redirect be performed by the calling environment. Typically called from within a
- * flow execution end state to request starting a new, independent execution of a flow in a chain-like manner.
- * Calling this method also sets responseComplete status to true.
- * @see #isResponseComplete()
- * @param flowId the id of the flow definition to redirect to
- * @param input input to pass the flow; this input is generally encoded the url to launch the flow
- * @throws IllegalStateException if the response has completed
- */
- void requestFlowDefinitionRedirect(String flowId, MutableAttributeMap> input) throws IllegalStateException;
-
- /**
- * Request a redirect to an arbitrary resource location. May not be supported in some environments. Calling this
- * method also sets responseComplete status to true.
- * @see #isResponseComplete()
- * @param location the location of the resource to redirect to
- * @throws IllegalStateException if the response has completed
- */
- void requestExternalRedirect(String location) throws IllegalStateException;
-
- /**
- * Request that the current redirect requested be sent to the client in a manner that causes the client to issue the
- * redirect from a popup dialog. Only call this method after a redirect has been requested.
- * @see #requestFlowExecutionRedirect()
- * @see #requestFlowDefinitionRedirect(String, MutableAttributeMap)
- * @see #requestExternalRedirect(String)
- * @throws IllegalStateException if a redirect has not been requested
- */
- void requestRedirectInPopup() throws IllegalStateException;
-
- /**
- * Called by flow artifacts such as View states and end states to indicate they handled the response, typically by
- * writing out content to the response stream. Setting this flag allows this external context to know the response
- * was handled, and that it not need to take additional response handling action itself.
- */
- void recordResponseComplete();
-
- /**
- * Has the response been completed? Response complete status can be achieved by:
- *
- * Writing out the response and calling {@link #recordResponseComplete()}, or
- * Calling one of the redirect request methods
- *
- * @see #getResponseWriter()
- * @see #recordResponseComplete()
- * @see #requestFlowExecutionRedirect()
- * @see #requestFlowDefinitionRedirect(String, MutableAttributeMap)
- * @see #requestExternalRedirect(String)
- * @return true if yes, false otherwise
- */
- boolean isResponseComplete();
-
- /**
- * Returns true if the response has been completed with flow execution redirect request.
- * @return true if a redirect response has been completed
- * @see #isResponseComplete()
- * @see #requestFlowExecutionRedirect()
- */
- boolean isResponseCompleteFlowExecutionRedirect();
-
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.context;
+
+import java.io.Writer;
+import java.security.Principal;
+import java.util.Locale;
+
+import org.springframework.webflow.core.collection.MutableAttributeMap;
+import org.springframework.webflow.core.collection.ParameterMap;
+import org.springframework.webflow.core.collection.SharedAttributeMap;
+
+/**
+ * A facade that provides normalized access to an external system that has called into the Spring Web Flow system.
+ *
+ * This context object provides a normalized interface for internal web flow artifacts to use to reason on and
+ * manipulate the state of an external actor calling into SWF to execute flows. It represents the context about a
+ * single, external client request to manipulate a flow execution.
+ *
+ * The design of this interface was inspired by JSF's own ExternalContext abstraction and shares the same name for
+ * consistency. If a particular external client type does not support all methods defined by this interface, they can
+ * just be implemented as returning an empty map or null.
+ *
+ * @author Keith Donald
+ * @author Erwin Vervaet
+ * @author Jeremy Grelle
+ * @author Scott Andrews
+ */
+public interface ExternalContext {
+
+ /**
+ * Returns the logical path to the application hosting this external context.
+ * @return the context path
+ */
+ String getContextPath();
+
+ /**
+ * Provides access to the parameters associated with the user request that led to SWF being called. This map is
+ * expected to be immutable and cannot be changed.
+ * @return the immutable request parameter map
+ */
+ ParameterMap getRequestParameterMap();
+
+ /**
+ * Provides access to the external request attribute map, providing a storage for data local to the current user
+ * request and accessible to both internal and external SWF artifacts.
+ * @return the mutable request attribute map
+ */
+ MutableAttributeMap getRequestMap();
+
+ /**
+ * Provides access to the external session map, providing a storage for data local to the current user session and
+ * accessible to both internal and external SWF artifacts.
+ * @return the mutable session attribute map
+ */
+ SharedAttributeMap getSessionMap();
+
+ /**
+ * Provides access to the global external session map, providing a storage for data globally accross the user
+ * session and accessible to both internal and external SWF artifacts.
+ *
+ * Note: most external context implementations do not distinguish between the concept of a "local" user session
+ * scope and a "global" session scope. Otherwise this method returns the same map as calling {@link #getSessionMap()}.
+ * @return the mutable global session attribute map
+ */
+ SharedAttributeMap getGlobalSessionMap();
+
+ /**
+ * Provides access to the external application map, providing a storage for data local to the current user
+ * application and accessible to both internal and external SWF artifacts.
+ * @return the mutable application attribute map
+ */
+ SharedAttributeMap getApplicationMap();
+
+ /**
+ * Returns true if the current request is an asynchronous Ajax request.
+ * @return true if the current request is an Ajax request
+ */
+ boolean isAjaxRequest();
+
+ /**
+ * Get a flow execution URL for the execution with the provided key. Typically used by response writers that write
+ * out references to the flow execution to support postback on a subsequent request. The URL returned is encoded.
+ * @param flowId the flow definition id
+ * @param flowExecutionKey the flow execution key
+ * @return the flow execution URL
+ */
+ String getFlowExecutionUrl(String flowId, String flowExecutionKey);
+
+ /**
+ * Provides access to the user's principal security object.
+ * @return the user principal
+ */
+ Principal getCurrentUser();
+
+ /**
+ * Returns the client locale.
+ * @return the locale
+ */
+ Locale getLocale();
+
+ /**
+ * Provides access to the context object for the current environment.
+ * @return the environment specific context object
+ */
+ Object getNativeContext();
+
+ /**
+ * Provides access to the request object for the current environment.
+ * @return the environment specific request object.
+ */
+ Object getNativeRequest();
+
+ /**
+ * Provides access to the response object for the current environment.
+ * @return the environment specific response object.
+ */
+ Object getNativeResponse();
+
+ /**
+ * Get a writer for writing out a response.
+ * @return the writer
+ * @throws IllegalStateException if the response has completed or is not allowed
+ */
+ Writer getResponseWriter() throws IllegalStateException;
+
+ /**
+ * Is a render response allowed to be written for this request? Always return false after a response has been
+ * completed. May return false before that to indicate a response is not allowed to be completed.
+ * @return true if yes, false otherwise
+ */
+ boolean isResponseAllowed();
+
+ /**
+ * Request that a flow execution redirect be performed by the calling environment. Typically called from within a
+ * flow execution to request a refresh operation, usually to support "refresh after event processing" behavior.
+ * Calling this method also sets responseComplete status to true.
+ * @see #isResponseComplete()
+ * @throws IllegalStateException if the response has completed
+ */
+ void requestFlowExecutionRedirect() throws IllegalStateException;
+
+ /**
+ * Request that a flow definition redirect be performed by the calling environment. Typically called from within a
+ * flow execution end state to request starting a new, independent execution of a flow in a chain-like manner.
+ * Calling this method also sets responseComplete status to true.
+ * @see #isResponseComplete()
+ * @param flowId the id of the flow definition to redirect to
+ * @param input input to pass the flow; this input is generally encoded the url to launch the flow
+ * @throws IllegalStateException if the response has completed
+ */
+ void requestFlowDefinitionRedirect(String flowId, MutableAttributeMap> input) throws IllegalStateException;
+
+ /**
+ * Request a redirect to an arbitrary resource location. May not be supported in some environments. Calling this
+ * method also sets responseComplete status to true.
+ * @see #isResponseComplete()
+ * @param location the location of the resource to redirect to
+ * @throws IllegalStateException if the response has completed
+ */
+ void requestExternalRedirect(String location) throws IllegalStateException;
+
+ /**
+ * Request that the current redirect requested be sent to the client in a manner that causes the client to issue the
+ * redirect from a popup dialog. Only call this method after a redirect has been requested.
+ * @see #requestFlowExecutionRedirect()
+ * @see #requestFlowDefinitionRedirect(String, MutableAttributeMap)
+ * @see #requestExternalRedirect(String)
+ * @throws IllegalStateException if a redirect has not been requested
+ */
+ void requestRedirectInPopup() throws IllegalStateException;
+
+ /**
+ * Called by flow artifacts such as View states and end states to indicate they handled the response, typically by
+ * writing out content to the response stream. Setting this flag allows this external context to know the response
+ * was handled, and that it not need to take additional response handling action itself.
+ */
+ void recordResponseComplete();
+
+ /**
+ * Has the response been completed? Response complete status can be achieved by:
+ *
+ * Writing out the response and calling {@link #recordResponseComplete()}, or
+ * Calling one of the redirect request methods
+ *
+ * @see #getResponseWriter()
+ * @see #recordResponseComplete()
+ * @see #requestFlowExecutionRedirect()
+ * @see #requestFlowDefinitionRedirect(String, MutableAttributeMap)
+ * @see #requestExternalRedirect(String)
+ * @return true if yes, false otherwise
+ */
+ boolean isResponseComplete();
+
+ /**
+ * Returns true if the response has been completed with flow execution redirect request.
+ * @return true if a redirect response has been completed
+ * @see #isResponseComplete()
+ * @see #requestFlowExecutionRedirect()
+ */
+ boolean isResponseCompleteFlowExecutionRedirect();
+
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/context/ExternalContextHolder.java b/spring-webflow/src/main/java/org/springframework/webflow/context/ExternalContextHolder.java
index 2bb55a95..3093b965 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/context/ExternalContextHolder.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/context/ExternalContextHolder.java
@@ -1,56 +1,56 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.context;
-
-import org.springframework.core.NamedThreadLocal;
-
-/**
- * Simple holder class that associates an {@link ExternalContext} instance with the current thread. The ExternalContext
- * will not be inherited by any child threads spawned by the current thread.
- *
- * Used as a central holder for the current ExternalContext in Spring Web Flow, wherever necessary. Often used by
- * artifacts needing access to the current application session.
- *
- * @see ExternalContext
- *
- * @author Keith Donald
- */
-public final class ExternalContextHolder {
-
- private static final ThreadLocal externalContextHolder = new NamedThreadLocal<>(
- "Flow ExternalContext");
-
- /**
- * Associate the given ExternalContext with the current thread.
- * @param externalContext the current ExternalContext, or null to reset the thread-bound context
- */
- public static void setExternalContext(ExternalContext externalContext) {
- externalContextHolder.set(externalContext);
- }
-
- /**
- * Return the ExternalContext associated with the current thread, if any.
- * @return the current ExternalContext
- */
- public static ExternalContext getExternalContext() {
- return externalContextHolder.get();
- }
-
- // not instantiable
- private ExternalContextHolder() {
- }
-
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.context;
+
+import org.springframework.core.NamedThreadLocal;
+
+/**
+ * Simple holder class that associates an {@link ExternalContext} instance with the current thread. The ExternalContext
+ * will not be inherited by any child threads spawned by the current thread.
+ *
+ * Used as a central holder for the current ExternalContext in Spring Web Flow, wherever necessary. Often used by
+ * artifacts needing access to the current application session.
+ *
+ * @see ExternalContext
+ *
+ * @author Keith Donald
+ */
+public final class ExternalContextHolder {
+
+ private static final ThreadLocal externalContextHolder = new NamedThreadLocal<>(
+ "Flow ExternalContext");
+
+ /**
+ * Associate the given ExternalContext with the current thread.
+ * @param externalContext the current ExternalContext, or null to reset the thread-bound context
+ */
+ public static void setExternalContext(ExternalContext externalContext) {
+ externalContextHolder.set(externalContext);
+ }
+
+ /**
+ * Return the ExternalContext associated with the current thread, if any.
+ * @return the current ExternalContext
+ */
+ public static ExternalContext getExternalContext() {
+ return externalContextHolder.get();
+ }
+
+ // not instantiable
+ private ExternalContextHolder() {
+ }
+
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/context/web/HttpSessionMapBindingListener.java b/spring-webflow/src/main/java/org/springframework/webflow/context/web/HttpSessionMapBindingListener.java
index 84cd1379..68d5681a 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/context/web/HttpSessionMapBindingListener.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/context/web/HttpSessionMapBindingListener.java
@@ -1,77 +1,77 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.context.web;
-
-import java.util.Map;
-
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionBindingListener;
-
-import org.springframework.webflow.core.collection.AttributeMapBindingEvent;
-import org.springframework.webflow.core.collection.AttributeMapBindingListener;
-import org.springframework.webflow.core.collection.LocalAttributeMap;
-
-/**
- * Helper class that adapts a generic {@link AttributeMapBindingListener} to a HTTP specific
- * {@link HttpSessionBindingListener}. Calls will be forwarded to the wrapped listener.
- *
- * @author Keith Donald
- */
-public class HttpSessionMapBindingListener implements HttpSessionBindingListener {
-
- private AttributeMapBindingListener listener;
-
- private Map sessionMap;
-
- /**
- * Create a new wrapper for given listener.
- * @param listener the listener to wrap
- * @param sessionMap the session map containing the listener
- */
- public HttpSessionMapBindingListener(AttributeMapBindingListener listener, Map sessionMap) {
- this.listener = listener;
- this.sessionMap = sessionMap;
- }
-
- /**
- * Returns the wrapped listener.
- */
- public AttributeMapBindingListener getListener() {
- return listener;
- }
-
- /**
- * Returns the session map containing the listener.
- */
- public Map getSessionMap() {
- return sessionMap;
- }
-
- public void valueBound(HttpSessionBindingEvent event) {
- listener.valueBound(getContextBindingEvent(event));
- }
-
- public void valueUnbound(HttpSessionBindingEvent event) {
- listener.valueUnbound(getContextBindingEvent(event));
- }
-
- /**
- * Create a attribute map binding event for given HTTP session binding event.
- */
- private AttributeMapBindingEvent getContextBindingEvent(HttpSessionBindingEvent event) {
- return new AttributeMapBindingEvent(new LocalAttributeMap<>(sessionMap), event.getName(), listener);
- }
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.context.web;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionBindingListener;
+
+import org.springframework.webflow.core.collection.AttributeMapBindingEvent;
+import org.springframework.webflow.core.collection.AttributeMapBindingListener;
+import org.springframework.webflow.core.collection.LocalAttributeMap;
+
+/**
+ * Helper class that adapts a generic {@link AttributeMapBindingListener} to a HTTP specific
+ * {@link HttpSessionBindingListener}. Calls will be forwarded to the wrapped listener.
+ *
+ * @author Keith Donald
+ */
+public class HttpSessionMapBindingListener implements HttpSessionBindingListener {
+
+ private AttributeMapBindingListener listener;
+
+ private Map sessionMap;
+
+ /**
+ * Create a new wrapper for given listener.
+ * @param listener the listener to wrap
+ * @param sessionMap the session map containing the listener
+ */
+ public HttpSessionMapBindingListener(AttributeMapBindingListener listener, Map sessionMap) {
+ this.listener = listener;
+ this.sessionMap = sessionMap;
+ }
+
+ /**
+ * Returns the wrapped listener.
+ */
+ public AttributeMapBindingListener getListener() {
+ return listener;
+ }
+
+ /**
+ * Returns the session map containing the listener.
+ */
+ public Map getSessionMap() {
+ return sessionMap;
+ }
+
+ public void valueBound(HttpSessionBindingEvent event) {
+ listener.valueBound(getContextBindingEvent(event));
+ }
+
+ public void valueUnbound(HttpSessionBindingEvent event) {
+ listener.valueUnbound(getContextBindingEvent(event));
+ }
+
+ /**
+ * Create a attribute map binding event for given HTTP session binding event.
+ */
+ private AttributeMapBindingEvent getContextBindingEvent(HttpSessionBindingEvent event) {
+ return new AttributeMapBindingEvent(new LocalAttributeMap<>(sessionMap), event.getName(), listener);
+ }
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/conversation/Conversation.java b/spring-webflow/src/main/java/org/springframework/webflow/conversation/Conversation.java
index c6ca7140..af95a2e0 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/conversation/Conversation.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/conversation/Conversation.java
@@ -1,97 +1,97 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.conversation;
-
-/**
- * A service interface for working with state associated with a single logical user interaction called a "conversation"
- * in the scope of a single request. Conversation objects are not thread safe and should not be shared among multiple
- * threads.
- *
- * A conversation provides a "task" context that is begun and eventually ends. Between the beginning and the end
- * attributes can be placed in and read from a conversation's context.
- *
- * A conversation needs to be {@link #lock() locked} to obtain exclusive access to it before it can be manipulated. Once
- * manipulation is finished, you need to {@link #unlock() unlock} the conversation. So code interacting with a
- * conversation always looks like this:
- *
- *
- * Conversation conv = ...;
- * conv.lock();
- * try {
- * // work with the Conversation object, calling methods like
- * // getAttribute(), putAttribute() and end()
- * }
- * finally {
- * conv.unlock();
- * }
- *
- *
- *
- * Note that the attributes associated with a conversation are not "conversation scope" as defined for a flow execution.
- * They can be any attributes, possibly technical in nature, associated with the conversation.
- *
- * @author Keith Donald
- * @author Erwin Vervaet
- */
-public interface Conversation {
-
- /**
- * Returns the unique id assigned to this conversation. This id remains the same throughout the life of the
- * conversation. This method can be safely called without owning the lock of this conversation.
- * @return the conversation id
- */
- ConversationId getId();
-
- /**
- * Lock this conversation. May block until the lock is available, if someone else has acquired the lock.
- * @throws ConversationLockException if the lock could not be acquired
- */
- void lock() throws ConversationLockException;
-
- /**
- * Returns the conversation attribute with the specified name. You need to acquire the lock on this conversation
- * before calling this method.
- * @param name the attribute name
- * @return the attribute value
- */
- Object getAttribute(Object name);
-
- /**
- * Puts a conversation attribute into this context. You need to acquire the lock on this conversation before calling
- * this method.
- * @param name the attribute name
- * @param value the attribute value
- */
- void putAttribute(Object name, Object value);
-
- /**
- * Removes a conversation attribute. You need to acquire the lock on this conversation before calling this method.
- * @param name the attribute name
- */
- void removeAttribute(Object name);
-
- /**
- * Ends this conversation. This method should only be called once to terminate the conversation and cleanup any
- * allocated resources. You need to aquire the lock on this conversation before calling this method.
- */
- void end();
-
- /**
- * Unlock this conversation, making it available to others for manipulation.
- */
- void unlock();
-
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.conversation;
+
+/**
+ * A service interface for working with state associated with a single logical user interaction called a "conversation"
+ * in the scope of a single request. Conversation objects are not thread safe and should not be shared among multiple
+ * threads.
+ *
+ * A conversation provides a "task" context that is begun and eventually ends. Between the beginning and the end
+ * attributes can be placed in and read from a conversation's context.
+ *
+ * A conversation needs to be {@link #lock() locked} to obtain exclusive access to it before it can be manipulated. Once
+ * manipulation is finished, you need to {@link #unlock() unlock} the conversation. So code interacting with a
+ * conversation always looks like this:
+ *
+ *
+ * Conversation conv = ...;
+ * conv.lock();
+ * try {
+ * // work with the Conversation object, calling methods like
+ * // getAttribute(), putAttribute() and end()
+ * }
+ * finally {
+ * conv.unlock();
+ * }
+ *
+ *
+ *
+ * Note that the attributes associated with a conversation are not "conversation scope" as defined for a flow execution.
+ * They can be any attributes, possibly technical in nature, associated with the conversation.
+ *
+ * @author Keith Donald
+ * @author Erwin Vervaet
+ */
+public interface Conversation {
+
+ /**
+ * Returns the unique id assigned to this conversation. This id remains the same throughout the life of the
+ * conversation. This method can be safely called without owning the lock of this conversation.
+ * @return the conversation id
+ */
+ ConversationId getId();
+
+ /**
+ * Lock this conversation. May block until the lock is available, if someone else has acquired the lock.
+ * @throws ConversationLockException if the lock could not be acquired
+ */
+ void lock() throws ConversationLockException;
+
+ /**
+ * Returns the conversation attribute with the specified name. You need to acquire the lock on this conversation
+ * before calling this method.
+ * @param name the attribute name
+ * @return the attribute value
+ */
+ Object getAttribute(Object name);
+
+ /**
+ * Puts a conversation attribute into this context. You need to acquire the lock on this conversation before calling
+ * this method.
+ * @param name the attribute name
+ * @param value the attribute value
+ */
+ void putAttribute(Object name, Object value);
+
+ /**
+ * Removes a conversation attribute. You need to acquire the lock on this conversation before calling this method.
+ * @param name the attribute name
+ */
+ void removeAttribute(Object name);
+
+ /**
+ * Ends this conversation. This method should only be called once to terminate the conversation and cleanup any
+ * allocated resources. You need to aquire the lock on this conversation before calling this method.
+ */
+ void end();
+
+ /**
+ * Unlock this conversation, making it available to others for manipulation.
+ */
+ void unlock();
+
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/conversation/ConversationException.java b/spring-webflow/src/main/java/org/springframework/webflow/conversation/ConversationException.java
index b8255f02..3cdb720c 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/conversation/ConversationException.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/conversation/ConversationException.java
@@ -1,41 +1,41 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.conversation;
-
-/**
- * The root of the conversation service exception hierarchy.
- *
- * @author Keith Donald
- */
-public abstract class ConversationException extends RuntimeException {
-
- /**
- * Creates a conversation service exception.
- * @param message a descriptive message
- */
- public ConversationException(String message) {
- super(message);
- }
-
- /**
- * Creates a conversation service exception.
- * @param message a descriptive message
- * @param cause the root cause of the problem
- */
- public ConversationException(String message, Throwable cause) {
- super(message, cause);
- }
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.conversation;
+
+/**
+ * The root of the conversation service exception hierarchy.
+ *
+ * @author Keith Donald
+ */
+public abstract class ConversationException extends RuntimeException {
+
+ /**
+ * Creates a conversation service exception.
+ * @param message a descriptive message
+ */
+ public ConversationException(String message) {
+ super(message);
+ }
+
+ /**
+ * Creates a conversation service exception.
+ * @param message a descriptive message
+ * @param cause the root cause of the problem
+ */
+ public ConversationException(String message, Throwable cause) {
+ super(message, cause);
+ }
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/conversation/NoSuchConversationException.java b/spring-webflow/src/main/java/org/springframework/webflow/conversation/NoSuchConversationException.java
index 719d90b0..eeb069c5 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/conversation/NoSuchConversationException.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/conversation/NoSuchConversationException.java
@@ -1,47 +1,47 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.conversation;
-
-/**
- * Thrown when no logical conversation exists with the specified conversationId. This might occur if the
- * conversation ended, expired, or was otherwise invalidated, but a client view still references it.
- *
- * @author Keith Donald
- */
-public class NoSuchConversationException extends ConversationException {
-
- /**
- * The unique conversation identifier that was invalid.
- */
- private ConversationId conversationId;
-
- /**
- * Create a new conversation lookup exception.
- * @param conversationId the conversation id
- */
- public NoSuchConversationException(ConversationId conversationId) {
- super("No conversation could be found with id '" + conversationId
- + "' -- perhaps this conversation has ended? ");
- this.conversationId = conversationId;
- }
-
- /**
- * Returns the conversation id that was not found.
- */
- public ConversationId getConversationId() {
- return conversationId;
- }
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.conversation;
+
+/**
+ * Thrown when no logical conversation exists with the specified conversationId. This might occur if the
+ * conversation ended, expired, or was otherwise invalidated, but a client view still references it.
+ *
+ * @author Keith Donald
+ */
+public class NoSuchConversationException extends ConversationException {
+
+ /**
+ * The unique conversation identifier that was invalid.
+ */
+ private ConversationId conversationId;
+
+ /**
+ * Create a new conversation lookup exception.
+ * @param conversationId the conversation id
+ */
+ public NoSuchConversationException(ConversationId conversationId) {
+ super("No conversation could be found with id '" + conversationId
+ + "' -- perhaps this conversation has ended? ");
+ this.conversationId = conversationId;
+ }
+
+ /**
+ * Returns the conversation id that was not found.
+ */
+ public ConversationId getConversationId() {
+ return conversationId;
+ }
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/ContainedConversation.java b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/ContainedConversation.java
index b1663af2..f52982e2 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/ContainedConversation.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/ContainedConversation.java
@@ -1,135 +1,135 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.conversation.impl;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.webflow.context.ExternalContextHolder;
-import org.springframework.webflow.conversation.Conversation;
-import org.springframework.webflow.conversation.ConversationId;
-import org.springframework.webflow.core.collection.SharedAttributeMap;
-
-/**
- * Internal {@link Conversation} implementation used by the conversation container.
- *
- * This is an internal helper class of the {@link SessionBindingConversationManager}.
- *
- * @author Erwin Vervaet
- */
-public class ContainedConversation implements Conversation, Serializable {
-
- private static final Log logger = LogFactory.getLog(SessionBindingConversationManager.class);
-
- private ConversationContainer container;
-
- private ConversationId id;
-
- private ConversationLock lock;
-
- private Map attributes;
-
- /**
- * Create a new contained conversation.
- * @param container the container containing the conversation
- * @param id the unique id assigned to the conversation
- * @param lock the conversation lock
- */
- public ContainedConversation(ConversationContainer container, ConversationId id, ConversationLock lock) {
- this.container = container;
- this.id = id;
- this.lock = lock;
- this.attributes = new HashMap<>();
- }
-
- protected void setContainer(ConversationContainer container) {
- this.container = container;
- }
-
- public ConversationId getId() {
- return this.id;
- }
-
- protected void setId(ConversationId id) {
- this.id = id;
- }
-
- public void lock() {
- if (logger.isDebugEnabled()) {
- logger.debug("Locking conversation " + this.id);
- }
- this.lock.lock();
- }
-
- public Object getAttribute(Object name) {
- return this.attributes.get(name);
- }
-
- public void putAttribute(Object name, Object value) {
- if (logger.isDebugEnabled()) {
- logger.debug("Putting conversation attribute '" + name + "' with value " + value);
- }
- this.attributes.put(name, value);
- }
-
- public void removeAttribute(Object name) {
- if (logger.isDebugEnabled()) {
- logger.debug("Removing conversation attribute '" + name + "'");
- }
- this.attributes.remove(name);
- }
-
- public void end() {
- if (logger.isDebugEnabled()) {
- logger.debug("Ending conversation " + this.id);
- }
- this.container.removeConversation(getId());
- }
-
- public void unlock() {
- if (logger.isDebugEnabled()) {
- logger.debug("Unlocking conversation " + this.id);
- }
- this.lock.unlock();
- // re-bind the conversation container in the session
- // this is required to make session replication work correctly in
- // a clustered environment
- // we do this after releasing the lock since we're no longer
- // manipulating the contents of the conversation
- SharedAttributeMap sessionMap = ExternalContextHolder.getExternalContext().getSessionMap();
- synchronized (sessionMap.getMutex()) {
- sessionMap.put(this.container.getSessionKey(), this.container);
- }
- }
-
- public String toString() {
- return getId().toString();
- }
-
- // id based equality
-
- public boolean equals(Object obj) {
- return obj instanceof ContainedConversation && this.id.equals(((ContainedConversation) obj).id);
- }
-
- public int hashCode() {
- return this.id.hashCode();
- }
-
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.conversation.impl;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.webflow.context.ExternalContextHolder;
+import org.springframework.webflow.conversation.Conversation;
+import org.springframework.webflow.conversation.ConversationId;
+import org.springframework.webflow.core.collection.SharedAttributeMap;
+
+/**
+ * Internal {@link Conversation} implementation used by the conversation container.
+ *
+ * This is an internal helper class of the {@link SessionBindingConversationManager}.
+ *
+ * @author Erwin Vervaet
+ */
+public class ContainedConversation implements Conversation, Serializable {
+
+ private static final Log logger = LogFactory.getLog(SessionBindingConversationManager.class);
+
+ private ConversationContainer container;
+
+ private ConversationId id;
+
+ private ConversationLock lock;
+
+ private Map attributes;
+
+ /**
+ * Create a new contained conversation.
+ * @param container the container containing the conversation
+ * @param id the unique id assigned to the conversation
+ * @param lock the conversation lock
+ */
+ public ContainedConversation(ConversationContainer container, ConversationId id, ConversationLock lock) {
+ this.container = container;
+ this.id = id;
+ this.lock = lock;
+ this.attributes = new HashMap<>();
+ }
+
+ protected void setContainer(ConversationContainer container) {
+ this.container = container;
+ }
+
+ public ConversationId getId() {
+ return this.id;
+ }
+
+ protected void setId(ConversationId id) {
+ this.id = id;
+ }
+
+ public void lock() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Locking conversation " + this.id);
+ }
+ this.lock.lock();
+ }
+
+ public Object getAttribute(Object name) {
+ return this.attributes.get(name);
+ }
+
+ public void putAttribute(Object name, Object value) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Putting conversation attribute '" + name + "' with value " + value);
+ }
+ this.attributes.put(name, value);
+ }
+
+ public void removeAttribute(Object name) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Removing conversation attribute '" + name + "'");
+ }
+ this.attributes.remove(name);
+ }
+
+ public void end() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Ending conversation " + this.id);
+ }
+ this.container.removeConversation(getId());
+ }
+
+ public void unlock() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Unlocking conversation " + this.id);
+ }
+ this.lock.unlock();
+ // re-bind the conversation container in the session
+ // this is required to make session replication work correctly in
+ // a clustered environment
+ // we do this after releasing the lock since we're no longer
+ // manipulating the contents of the conversation
+ SharedAttributeMap sessionMap = ExternalContextHolder.getExternalContext().getSessionMap();
+ synchronized (sessionMap.getMutex()) {
+ sessionMap.put(this.container.getSessionKey(), this.container);
+ }
+ }
+
+ public String toString() {
+ return getId().toString();
+ }
+
+ // id based equality
+
+ public boolean equals(Object obj) {
+ return obj instanceof ContainedConversation && this.id.equals(((ContainedConversation) obj).id);
+ }
+
+ public int hashCode() {
+ return this.id.hashCode();
+ }
+
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/ConversationLock.java b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/ConversationLock.java
index 534d3a6c..dcd10e83 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/ConversationLock.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/ConversationLock.java
@@ -1,39 +1,39 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.conversation.impl;
-
-import java.io.Serializable;
-
-import org.springframework.webflow.conversation.ConversationLockException;
-
-/**
- * A normalized interface for conversation locks, used to obtain exclusive access to a conversation.
- *
- * @author Keith Donald
- */
-public interface ConversationLock extends Serializable {
-
- /**
- * Acquire the conversation lock.
- * @throws ConversationLockException if an exception is thrown attempting to acquire this lock
- */
- void lock() throws ConversationLockException;
-
- /**
- * Release the conversation lock.
- */
- void unlock();
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.conversation.impl;
+
+import java.io.Serializable;
+
+import org.springframework.webflow.conversation.ConversationLockException;
+
+/**
+ * A normalized interface for conversation locks, used to obtain exclusive access to a conversation.
+ *
+ * @author Keith Donald
+ */
+public interface ConversationLock extends Serializable {
+
+ /**
+ * Acquire the conversation lock.
+ * @throws ConversationLockException if an exception is thrown attempting to acquire this lock
+ */
+ void lock() throws ConversationLockException;
+
+ /**
+ * Release the conversation lock.
+ */
+ void unlock();
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/JdkConcurrentConversationLock.java b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/JdkConcurrentConversationLock.java
index f9111b2f..023bd4f8 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/JdkConcurrentConversationLock.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/JdkConcurrentConversationLock.java
@@ -1,54 +1,54 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.conversation.impl;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.springframework.webflow.conversation.ConversationLockException;
-
-/**
- * A conversation lock that relies on a {@link ReentrantLock} within Java 5's util.concurrent.locks
- * package.
- *
- * @author Keith Donald
- */
-public class JdkConcurrentConversationLock implements ConversationLock {
-
- private Lock lock = new ReentrantLock();
-
- private int timeoutSeconds;
-
- public JdkConcurrentConversationLock(int timeoutSeconds) {
- this.timeoutSeconds = timeoutSeconds;
- }
-
- public void lock() throws ConversationLockException {
- try {
- boolean acquired = this.lock.tryLock(this.timeoutSeconds, TimeUnit.SECONDS);
- if (!acquired) {
- throw new LockTimeoutException(this.timeoutSeconds);
- }
- } catch (InterruptedException e) {
- throw new LockInterruptedException(e);
- }
- }
-
- public void unlock() {
- this.lock.unlock();
- }
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.conversation.impl;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.springframework.webflow.conversation.ConversationLockException;
+
+/**
+ * A conversation lock that relies on a {@link ReentrantLock} within Java 5's util.concurrent.locks
+ * package.
+ *
+ * @author Keith Donald
+ */
+public class JdkConcurrentConversationLock implements ConversationLock {
+
+ private Lock lock = new ReentrantLock();
+
+ private int timeoutSeconds;
+
+ public JdkConcurrentConversationLock(int timeoutSeconds) {
+ this.timeoutSeconds = timeoutSeconds;
+ }
+
+ public void lock() throws ConversationLockException {
+ try {
+ boolean acquired = this.lock.tryLock(this.timeoutSeconds, TimeUnit.SECONDS);
+ if (!acquired) {
+ throw new LockTimeoutException(this.timeoutSeconds);
+ }
+ } catch (InterruptedException e) {
+ throw new LockInterruptedException(e);
+ }
+ }
+
+ public void unlock() {
+ this.lock.unlock();
+ }
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/NoOpConversationLock.java b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/NoOpConversationLock.java
index 7879328f..18bd8e7e 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/NoOpConversationLock.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/NoOpConversationLock.java
@@ -1,51 +1,51 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.conversation.impl;
-
-import java.io.ObjectStreamException;
-
-/**
- * A singleton lock that doesn't do anything. For use when conversations don't require or choose not to implement
- * locking.
- *
- * @author Keith Donald
- */
-public class NoOpConversationLock implements ConversationLock {
-
- /**
- * The singleton instance.
- */
- public static final NoOpConversationLock INSTANCE = new NoOpConversationLock();
-
- /**
- * Private constructor to avoid instantiation.
- */
- private NoOpConversationLock() {
- }
-
- public void lock() {
- // no-op
- }
-
- public void unlock() {
- // no-op
- }
-
- // resolve the singleton instance
- private Object readResolve() throws ObjectStreamException {
- return INSTANCE;
- }
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.conversation.impl;
+
+import java.io.ObjectStreamException;
+
+/**
+ * A singleton lock that doesn't do anything. For use when conversations don't require or choose not to implement
+ * locking.
+ *
+ * @author Keith Donald
+ */
+public class NoOpConversationLock implements ConversationLock {
+
+ /**
+ * The singleton instance.
+ */
+ public static final NoOpConversationLock INSTANCE = new NoOpConversationLock();
+
+ /**
+ * Private constructor to avoid instantiation.
+ */
+ private NoOpConversationLock() {
+ }
+
+ public void lock() {
+ // no-op
+ }
+
+ public void unlock() {
+ // no-op
+ }
+
+ // resolve the singleton instance
+ private Object readResolve() throws ObjectStreamException {
+ return INSTANCE;
+ }
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/SessionBindingConversationManager.java b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/SessionBindingConversationManager.java
index 00b3b5ae..5f5872d6 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/SessionBindingConversationManager.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/conversation/impl/SessionBindingConversationManager.java
@@ -1,149 +1,149 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.conversation.impl;
-
-import org.springframework.webflow.context.ExternalContextHolder;
-import org.springframework.webflow.conversation.Conversation;
-import org.springframework.webflow.conversation.ConversationException;
-import org.springframework.webflow.conversation.ConversationId;
-import org.springframework.webflow.conversation.ConversationManager;
-import org.springframework.webflow.conversation.ConversationParameters;
-import org.springframework.webflow.core.collection.SharedAttributeMap;
-
-/**
- * Simple implementation of a conversation manager that stores conversations in the session attribute map.
- *
- * Using the {@link #setMaxConversations(int) maxConversations} property, you can limit the number of concurrently
- * active conversations allowed in a single session. If the maximum is exceeded, the conversation manager will
- * automatically end the oldest conversation. The default is 5, which should be fine for most situations. Set it to -1
- * for no limit. Setting maxConversations to 1 allows easy resource cleanup in situations where there should only be one
- * active conversation per session.
- *
- * @author Erwin Vervaet
- */
-public class SessionBindingConversationManager implements ConversationManager {
-
- /**
- * The name of the session attribute that will hold the conversation container used by this conversation manager.
- *
- * To support multiple independent conversation containers in the same web application, for example, for use with
- * multiple flow executors each configured with their own session-binding conversation manager, set this field's
- * value to something unique.
- * @see #setSessionKey(String)
- */
- private String sessionKey = "webflowConversationContainer";
-
- /**
- * The maximum number of active conversations allowed in a session. The default is 5. This is high enough for most
- * practical situations and low enough to avoid excessive resource usage or easy denial of service attacks.
- */
- private int maxConversations = 5;
-
- /**
- * The lock timeout in seconds.
- */
- private int lockTimeoutSeconds = 30;
-
- /**
- * Returns the key this conversation manager uses to store conversation data in the session.
- * @return the session key
- */
- public String getSessionKey() {
- return sessionKey;
- }
-
- /**
- * Sets the key this conversation manager uses to store conversation data in the session. If multiple session
- * binding conversation managers are used in the same web application to back independent flow executors, this value
- * should be unique among them.
- * @param sessionKey the session key
- */
- public void setSessionKey(String sessionKey) {
- this.sessionKey = sessionKey;
- }
-
- /**
- * Returns the maximum number of allowed concurrent conversations. The default is 5.
- */
- public int getMaxConversations() {
- return maxConversations;
- }
-
- /**
- * Set the maximum number of allowed concurrent conversations. Set to -1 for no limit. The default is 5.
- */
- public void setMaxConversations(int maxConversations) {
- this.maxConversations = maxConversations;
- }
-
- /**
- * Returns the time period that can elapse before a timeout occurs on an attempt to acquire a conversation lock. The
- * default is 30 seconds.
- */
- public int getLockTimeoutSeconds() {
- return lockTimeoutSeconds;
- }
-
- /**
- * Sets the time period that can elapse before a timeout occurs on an attempt to acquire a conversation lock. The
- * default is 30 seconds.
- * @param lockTimeoutSeconds the timeout period in seconds
- */
- public void setLockTimeoutSeconds(int lockTimeoutSeconds) {
- this.lockTimeoutSeconds = lockTimeoutSeconds;
- }
-
- // implementing conversation manager
-
- public Conversation beginConversation(ConversationParameters conversationParameters) throws ConversationException {
- ConversationLock lock = new JdkConcurrentConversationLock(lockTimeoutSeconds);
- return getConversationContainer().createConversation(conversationParameters, lock);
- }
-
- public Conversation getConversation(ConversationId id) throws ConversationException {
- return getConversationContainer().getConversation(id);
- }
-
- public ConversationId parseConversationId(String encodedId) throws ConversationException {
- try {
- return new SimpleConversationId(Integer.valueOf(encodedId));
- } catch (NumberFormatException e) {
- throw new BadlyFormattedConversationIdException(encodedId, e);
- }
- }
-
- // hooks for subclassing
-
- protected ConversationContainer createConversationContainer() {
- return new ConversationContainer(maxConversations, sessionKey);
- }
-
- /**
- * Obtain the conversation container from the session. Create a new empty container and add it to the session if no
- * existing container can be found.
- */
- protected final ConversationContainer getConversationContainer() {
- SharedAttributeMap sessionMap = ExternalContextHolder.getExternalContext().getSessionMap();
- synchronized (sessionMap.getMutex()) {
- ConversationContainer container = (ConversationContainer) sessionMap.get(sessionKey);
- if (container == null) {
- container = createConversationContainer();
- sessionMap.put(sessionKey, container);
- }
- return container;
- }
- }
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.conversation.impl;
+
+import org.springframework.webflow.context.ExternalContextHolder;
+import org.springframework.webflow.conversation.Conversation;
+import org.springframework.webflow.conversation.ConversationException;
+import org.springframework.webflow.conversation.ConversationId;
+import org.springframework.webflow.conversation.ConversationManager;
+import org.springframework.webflow.conversation.ConversationParameters;
+import org.springframework.webflow.core.collection.SharedAttributeMap;
+
+/**
+ * Simple implementation of a conversation manager that stores conversations in the session attribute map.
+ *
+ * Using the {@link #setMaxConversations(int) maxConversations} property, you can limit the number of concurrently
+ * active conversations allowed in a single session. If the maximum is exceeded, the conversation manager will
+ * automatically end the oldest conversation. The default is 5, which should be fine for most situations. Set it to -1
+ * for no limit. Setting maxConversations to 1 allows easy resource cleanup in situations where there should only be one
+ * active conversation per session.
+ *
+ * @author Erwin Vervaet
+ */
+public class SessionBindingConversationManager implements ConversationManager {
+
+ /**
+ * The name of the session attribute that will hold the conversation container used by this conversation manager.
+ *
+ * To support multiple independent conversation containers in the same web application, for example, for use with
+ * multiple flow executors each configured with their own session-binding conversation manager, set this field's
+ * value to something unique.
+ * @see #setSessionKey(String)
+ */
+ private String sessionKey = "webflowConversationContainer";
+
+ /**
+ * The maximum number of active conversations allowed in a session. The default is 5. This is high enough for most
+ * practical situations and low enough to avoid excessive resource usage or easy denial of service attacks.
+ */
+ private int maxConversations = 5;
+
+ /**
+ * The lock timeout in seconds.
+ */
+ private int lockTimeoutSeconds = 30;
+
+ /**
+ * Returns the key this conversation manager uses to store conversation data in the session.
+ * @return the session key
+ */
+ public String getSessionKey() {
+ return sessionKey;
+ }
+
+ /**
+ * Sets the key this conversation manager uses to store conversation data in the session. If multiple session
+ * binding conversation managers are used in the same web application to back independent flow executors, this value
+ * should be unique among them.
+ * @param sessionKey the session key
+ */
+ public void setSessionKey(String sessionKey) {
+ this.sessionKey = sessionKey;
+ }
+
+ /**
+ * Returns the maximum number of allowed concurrent conversations. The default is 5.
+ */
+ public int getMaxConversations() {
+ return maxConversations;
+ }
+
+ /**
+ * Set the maximum number of allowed concurrent conversations. Set to -1 for no limit. The default is 5.
+ */
+ public void setMaxConversations(int maxConversations) {
+ this.maxConversations = maxConversations;
+ }
+
+ /**
+ * Returns the time period that can elapse before a timeout occurs on an attempt to acquire a conversation lock. The
+ * default is 30 seconds.
+ */
+ public int getLockTimeoutSeconds() {
+ return lockTimeoutSeconds;
+ }
+
+ /**
+ * Sets the time period that can elapse before a timeout occurs on an attempt to acquire a conversation lock. The
+ * default is 30 seconds.
+ * @param lockTimeoutSeconds the timeout period in seconds
+ */
+ public void setLockTimeoutSeconds(int lockTimeoutSeconds) {
+ this.lockTimeoutSeconds = lockTimeoutSeconds;
+ }
+
+ // implementing conversation manager
+
+ public Conversation beginConversation(ConversationParameters conversationParameters) throws ConversationException {
+ ConversationLock lock = new JdkConcurrentConversationLock(lockTimeoutSeconds);
+ return getConversationContainer().createConversation(conversationParameters, lock);
+ }
+
+ public Conversation getConversation(ConversationId id) throws ConversationException {
+ return getConversationContainer().getConversation(id);
+ }
+
+ public ConversationId parseConversationId(String encodedId) throws ConversationException {
+ try {
+ return new SimpleConversationId(Integer.valueOf(encodedId));
+ } catch (NumberFormatException e) {
+ throw new BadlyFormattedConversationIdException(encodedId, e);
+ }
+ }
+
+ // hooks for subclassing
+
+ protected ConversationContainer createConversationContainer() {
+ return new ConversationContainer(maxConversations, sessionKey);
+ }
+
+ /**
+ * Obtain the conversation container from the session. Create a new empty container and add it to the session if no
+ * existing container can be found.
+ */
+ protected final ConversationContainer getConversationContainer() {
+ SharedAttributeMap sessionMap = ExternalContextHolder.getExternalContext().getSessionMap();
+ synchronized (sessionMap.getMutex()) {
+ ConversationContainer container = (ConversationContainer) sessionMap.get(sessionKey);
+ if (container == null) {
+ container = createConversationContainer();
+ sessionMap.put(sessionKey, container);
+ }
+ return container;
+ }
+ }
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/Annotated.java b/spring-webflow/src/main/java/org/springframework/webflow/core/Annotated.java
index 14a2ed27..e08d0e95 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/core/Annotated.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/Annotated.java
@@ -1,47 +1,47 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.core;
-
-import org.springframework.webflow.core.collection.MutableAttributeMap;
-
-/**
- * An interface to be implemented by objects that are annotated with attributes they wish to expose to clients.
- *
- * @author Keith Donald
- * @author Erwin Vervaet
- */
-public interface Annotated {
-
- /**
- * Returns a short summary of this object, suitable for display as an icon caption or tool tip.
- * @return the caption
- */
- String getCaption();
-
- /**
- * Returns a longer, more detailed description of this object.
- * @return the description
- */
- String getDescription();
-
- /**
- * Returns a attribute map containing the attributes annotating this object. These attributes provide descriptive
- * characteristics or properties that may affect object behavior.
- * @return the attribute map
- */
- MutableAttributeMap getAttributes();
-
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.core;
+
+import org.springframework.webflow.core.collection.MutableAttributeMap;
+
+/**
+ * An interface to be implemented by objects that are annotated with attributes they wish to expose to clients.
+ *
+ * @author Keith Donald
+ * @author Erwin Vervaet
+ */
+public interface Annotated {
+
+ /**
+ * Returns a short summary of this object, suitable for display as an icon caption or tool tip.
+ * @return the caption
+ */
+ String getCaption();
+
+ /**
+ * Returns a longer, more detailed description of this object.
+ * @return the description
+ */
+ String getDescription();
+
+ /**
+ * Returns a attribute map containing the attributes annotating this object. These attributes provide descriptive
+ * characteristics or properties that may affect object behavior.
+ * @return the attribute map
+ */
+ MutableAttributeMap getAttributes();
+
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/AnnotatedObject.java b/spring-webflow/src/main/java/org/springframework/webflow/core/AnnotatedObject.java
index b4f63cbb..384d66b9 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/core/AnnotatedObject.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/AnnotatedObject.java
@@ -1,79 +1,79 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.core;
-
-import org.springframework.webflow.core.collection.LocalAttributeMap;
-import org.springframework.webflow.core.collection.MutableAttributeMap;
-
-/**
- * A base class for all objects in the web flow system that support annotation using arbitrary properties. Mainly used
- * to ensure consistent configuration of properties for all annotated objects.
- *
- * @author Erwin Vervaet
- * @author Keith Donald
- */
-public abstract class AnnotatedObject implements Annotated {
-
- /**
- * The caption property name ("caption"). A caption is also known as a "short description" and may be used in a GUI
- * tooltip.
- */
- public static final String CAPTION_PROPERTY = "caption";
-
- /**
- * The long description property name ("description"). A description provides additional, free-form detail about
- * this object and might be shown in a GUI text area.
- */
- public static final String DESCRIPTION_PROPERTY = "description";
-
- /**
- * Additional properties further describing this object. The properties set in this map may be arbitrary.
- */
- private LocalAttributeMap attributes = new LocalAttributeMap<>();
-
- // implementing Annotated
-
- public String getCaption() {
- return attributes.getString(CAPTION_PROPERTY);
- }
-
- public String getDescription() {
- return attributes.getString(DESCRIPTION_PROPERTY);
- }
-
- public MutableAttributeMap getAttributes() {
- return attributes;
- }
-
- // mutators
-
- /**
- * Sets the short description (suitable for display in a tooltip).
- * @param caption the caption
- */
- public void setCaption(String caption) {
- attributes.put(CAPTION_PROPERTY, caption);
- }
-
- /**
- * Sets the long description.
- * @param description the long description
- */
- public void setDescription(String description) {
- attributes.put(DESCRIPTION_PROPERTY, description);
- }
-
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.core;
+
+import org.springframework.webflow.core.collection.LocalAttributeMap;
+import org.springframework.webflow.core.collection.MutableAttributeMap;
+
+/**
+ * A base class for all objects in the web flow system that support annotation using arbitrary properties. Mainly used
+ * to ensure consistent configuration of properties for all annotated objects.
+ *
+ * @author Erwin Vervaet
+ * @author Keith Donald
+ */
+public abstract class AnnotatedObject implements Annotated {
+
+ /**
+ * The caption property name ("caption"). A caption is also known as a "short description" and may be used in a GUI
+ * tooltip.
+ */
+ public static final String CAPTION_PROPERTY = "caption";
+
+ /**
+ * The long description property name ("description"). A description provides additional, free-form detail about
+ * this object and might be shown in a GUI text area.
+ */
+ public static final String DESCRIPTION_PROPERTY = "description";
+
+ /**
+ * Additional properties further describing this object. The properties set in this map may be arbitrary.
+ */
+ private LocalAttributeMap attributes = new LocalAttributeMap<>();
+
+ // implementing Annotated
+
+ public String getCaption() {
+ return attributes.getString(CAPTION_PROPERTY);
+ }
+
+ public String getDescription() {
+ return attributes.getString(DESCRIPTION_PROPERTY);
+ }
+
+ public MutableAttributeMap getAttributes() {
+ return attributes;
+ }
+
+ // mutators
+
+ /**
+ * Sets the short description (suitable for display in a tooltip).
+ * @param caption the caption
+ */
+ public void setCaption(String caption) {
+ attributes.put(CAPTION_PROPERTY, caption);
+ }
+
+ /**
+ * Sets the long description.
+ * @param description the long description
+ */
+ public void setDescription(String description) {
+ attributes.put(DESCRIPTION_PROPERTY, description);
+ }
+
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/FlowException.java b/spring-webflow/src/main/java/org/springframework/webflow/core/FlowException.java
index b90d1d0d..8f7d9d3f 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/core/FlowException.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/FlowException.java
@@ -1,44 +1,44 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.core;
-
-/**
- * Root class for exceptions thrown by the Spring Web Flow system. All other exceptions within the system should be
- * assignable to this class.
- *
- * @author Keith Donald
- * @author Erwin Vervaet
- */
-public abstract class FlowException extends RuntimeException {
-
- /**
- * Creates a new flow exception.
- * @param msg the message
- * @param cause the cause
- */
- public FlowException(String msg, Throwable cause) {
- super(msg, cause);
- }
-
- /**
- * Creates a new flow exception.
- * @param msg the message
- */
- public FlowException(String msg) {
- super(msg);
- }
-
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.core;
+
+/**
+ * Root class for exceptions thrown by the Spring Web Flow system. All other exceptions within the system should be
+ * assignable to this class.
+ *
+ * @author Keith Donald
+ * @author Erwin Vervaet
+ */
+public abstract class FlowException extends RuntimeException {
+
+ /**
+ * Creates a new flow exception.
+ * @param msg the message
+ * @param cause the cause
+ */
+ public FlowException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
+
+ /**
+ * Creates a new flow exception.
+ * @param msg the message
+ */
+ public FlowException(String msg) {
+ super(msg);
+ }
+
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMap.java b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMap.java
index 94274ccb..cb2aeacb 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMap.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMap.java
@@ -1,315 +1,315 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.core.collection;
-
-import java.util.Collection;
-
-import org.springframework.binding.collection.MapAdaptable;
-
-/**
- * An immutable interface for accessing attributes in a backing map with string keys.
- *
- * Implementations can optionally support {@link AttributeMapBindingListener listeners} that will be notified when
- * they're bound in or unbound from the map.
- *
- * @author Keith Donald
- */
-public interface AttributeMap extends MapAdaptable {
-
- /**
- * Get an attribute value out of this map, returning null if not found.
- * @param attributeName the attribute name
- * @return the attribute value
- */
- V get(String attributeName);
-
- /**
- * Returns the size of this map.
- * @return the number of entries in the map
- */
- int size();
-
- /**
- * Is this attribute map empty with a size of 0?
- * @return true if empty, false if not
- */
- boolean isEmpty();
-
- /**
- * Does the attribute with the provided name exist in this map?
- * @param attributeName the attribute name
- * @return true if so, false otherwise
- */
- boolean contains(String attributeName);
-
- /**
- * Does the attribute with the provided name exist in this map and is its value of the specified required type?
- * @param attributeName the attribute name
- * @param requiredType the required class of the attribute value
- * @return true if so, false otherwise
- * @throws IllegalArgumentException when the value is not of the required type
- */
- boolean contains(String attributeName, Class extends V> requiredType) throws IllegalArgumentException;
-
- /**
- * Get an attribute value, returning the default value if no value is found.
- * @param attributeName the name of the attribute
- * @param defaultValue the default value
- * @return the attribute value, falling back to the default if no such attribute exists
- */
- V get(String attributeName, V defaultValue);
-
- /**
- * Get an attribute value, asserting the value is of the required type.
- * @param attributeName the name of the attribute
- * @param requiredType the required type of the attribute value
- * @return the attribute value, or null if not found
- * @throws IllegalArgumentException when the value is not of the required type
- */
- T get(String attributeName, Class requiredType) throws IllegalArgumentException;
-
- /**
- * Get an attribute value, asserting the value is of the required type and returning the default value if not found.
- * @param attributeName the name of the attribute
- * @param requiredType the value required type
- * @param defaultValue the default value
- * @return the attribute value, or the default if not found
- * @throws IllegalArgumentException when the value (if found) is not of the required type
- */
- T get(String attributeName, Class requiredType, T defaultValue)
- throws IllegalStateException;
-
- /**
- * Get the value of a required attribute, throwing an exception of no attribute is found.
- * @param attributeName the name of the attribute
- * @return the attribute value
- * @throws IllegalArgumentException when the attribute is not found
- */
- V getRequired(String attributeName) throws IllegalArgumentException;
-
- /**
- * Get the value of a required attribute and make sure it is of the required type.
- * @param attributeName name of the attribute to get
- * @param requiredType the required type of the attribute value
- * @return the attribute value
- * @throws IllegalArgumentException when the attribute is not found or not of the required type
- */
- T getRequired(String attributeName, Class requiredType) throws IllegalArgumentException;
-
- /**
- * Returns a string attribute value in the map, returning null if no value was found.
- * @param attributeName the attribute name
- * @return the string attribute value
- * @throws IllegalArgumentException if the attribute is present but not a string
- */
- String getString(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns a string attribute value in the map, returning the default value if no value was found.
- * @param attributeName the attribute name
- * @param defaultValue the default
- * @return the string attribute value
- * @throws IllegalArgumentException if the attribute is present but not a string
- */
- String getString(String attributeName, String defaultValue) throws IllegalArgumentException;
-
- /**
- * Returns a string attribute value in the map, throwing an exception if the attribute is not present and of the
- * correct type.
- * @param attributeName the attribute name
- * @return the string attribute value
- * @throws IllegalArgumentException if the attribute is not present or present but not a string
- */
- String getRequiredString(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns a collection attribute value in the map.
- * @param attributeName the attribute name
- * @return the collection attribute value
- * @throws IllegalArgumentException if the attribute is present but not a collection
- */
- Collection getCollection(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns a collection attribute value in the map and make sure it is of the required type.
- * @param attributeName the attribute name
- * @param requiredType the required type of the attribute value
- * @return the collection attribute value
- * @throws IllegalArgumentException if the attribute is present but not a collection of the required type
- */
- > T getCollection(String attributeName, Class requiredType)
- throws IllegalArgumentException;
-
- /**
- * Returns a collection attribute value in the map, throwing an exception if the attribute is not present or not a
- * collection.
- * @param attributeName the attribute name
- * @return the collection attribute value
- * @throws IllegalArgumentException if the attribute is not present or is present but not a collection
- */
- Collection getRequiredCollection(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns a collection attribute value in the map, throwing an exception if the attribute is not present or not a
- * collection of the required type.
- * @param attributeName the attribute name
- * @param requiredType the required collection type
- * @return the collection attribute value
- * @throws IllegalArgumentException if the attribute is not present or is present but not a collection of the
- * required type
- */
- > T getRequiredCollection(String attributeName, Class requiredType)
- throws IllegalArgumentException;
-
- /**
- * Returns an array attribute value in the map and makes sure it is of the required type.
- * @param attributeName the attribute name
- * @param requiredType the required type of the attribute value
- * @return the array attribute value
- * @throws IllegalArgumentException if the attribute is present but not an array of the required type
- */
- T[] getArray(String attributeName, Class extends T[]> requiredType)
- throws IllegalArgumentException;
-
- /**
- * Returns an array attribute value in the map, throwing an exception if the attribute is not present or not an
- * array of the required type.
- * @param attributeName the attribute name
- * @param requiredType the required array type
- * @return the collection attribute value
- * @throws IllegalArgumentException if the attribute is not present or is present but not a array of the required
- * type
- */
- T[] getRequiredArray(String attributeName, Class extends T[]> requiredType)
- throws IllegalArgumentException;
-
- /**
- * Returns a number attribute value in the map that is of the specified type, returning null if no
- * value was found.
- * @param attributeName the attribute name
- * @param requiredType the required number type
- * @return the number attribute value
- * @throws IllegalArgumentException if the attribute is present but not a number of the required type
- */
- T getNumber(String attributeName, Class requiredType) throws IllegalArgumentException;
-
- /**
- * Returns a number attribute value in the map of the specified type, returning the default value if no value was
- * found.
- * @param attributeName the attribute name
- * @param defaultValue the default
- * @return the number attribute value
- * @throws IllegalArgumentException if the attribute is present but not a number of the required type
- */
- T getNumber(String attributeName, Class requiredType, T defaultValue)
- throws IllegalArgumentException;
-
- /**
- * Returns a number attribute value in the map, throwing an exception if the attribute is not present and of the
- * correct type.
- * @param attributeName the attribute name
- * @return the number attribute value
- * @throws IllegalArgumentException if the attribute is not present or present but not a number of the required type
- */
- T getRequiredNumber(String attributeName, Class requiredType)
- throws IllegalArgumentException;
-
- /**
- * Returns an integer attribute value in the map, returning null if no value was found.
- * @param attributeName the attribute name
- * @return the integer attribute value
- * @throws IllegalArgumentException if the attribute is present but not an integer
- */
- Integer getInteger(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns an integer attribute value in the map, returning the default value if no value was found.
- * @param attributeName the attribute name
- * @param defaultValue the default
- * @return the integer attribute value
- * @throws IllegalArgumentException if the attribute is present but not an integer
- */
- Integer getInteger(String attributeName, Integer defaultValue) throws IllegalArgumentException;
-
- /**
- * Returns an integer attribute value in the map, throwing an exception if the attribute is not present and of the
- * correct type.
- * @param attributeName the attribute name
- * @return the integer attribute value
- * @throws IllegalArgumentException if the attribute is not present or present but not an integer
- */
- Integer getRequiredInteger(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns a long attribute value in the map, returning null if no value was found.
- * @param attributeName the attribute name
- * @return the long attribute value
- * @throws IllegalArgumentException if the attribute is present but not a long
- */
- Long getLong(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns a long attribute value in the map, returning the default value if no value was found.
- * @param attributeName the attribute name
- * @param defaultValue the default
- * @return the long attribute value
- * @throws IllegalArgumentException if the attribute is present but not a long
- */
- Long getLong(String attributeName, Long defaultValue) throws IllegalArgumentException;
-
- /**
- * Returns a long attribute value in the map, throwing an exception if the attribute is not present and of the
- * correct type.
- * @param attributeName the attribute name
- * @return the long attribute value
- * @throws IllegalArgumentException if the attribute is not present or present but not a long
- */
- Long getRequiredLong(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns a boolean attribute value in the map, returning null if no value was found.
- * @param attributeName the attribute name
- * @return the long attribute value
- * @throws IllegalArgumentException if the attribute is present but not a boolean
- */
- Boolean getBoolean(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns a boolean attribute value in the map, returning the default value if no value was found.
- * @param attributeName the attribute name
- * @param defaultValue the default
- * @return the boolean attribute value
- * @throws IllegalArgumentException if the attribute is present but not a boolean
- */
- Boolean getBoolean(String attributeName, Boolean defaultValue) throws IllegalArgumentException;
-
- /**
- * Returns a boolean attribute value in the map, throwing an exception if the attribute is not present and of the
- * correct type.
- * @param attributeName the attribute name
- * @return the boolean attribute value
- * @throws IllegalArgumentException if the attribute is not present or present but is not a boolean
- */
- Boolean getRequiredBoolean(String attributeName) throws IllegalArgumentException;
-
- /**
- * Returns a new attribute map containing the union of this map with the provided map.
- * @param attributes the map to combine with this map
- * @return a new, combined map
- */
- AttributeMap union(AttributeMap extends V> attributes);
-
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.core.collection;
+
+import java.util.Collection;
+
+import org.springframework.binding.collection.MapAdaptable;
+
+/**
+ * An immutable interface for accessing attributes in a backing map with string keys.
+ *
+ * Implementations can optionally support {@link AttributeMapBindingListener listeners} that will be notified when
+ * they're bound in or unbound from the map.
+ *
+ * @author Keith Donald
+ */
+public interface AttributeMap extends MapAdaptable {
+
+ /**
+ * Get an attribute value out of this map, returning null if not found.
+ * @param attributeName the attribute name
+ * @return the attribute value
+ */
+ V get(String attributeName);
+
+ /**
+ * Returns the size of this map.
+ * @return the number of entries in the map
+ */
+ int size();
+
+ /**
+ * Is this attribute map empty with a size of 0?
+ * @return true if empty, false if not
+ */
+ boolean isEmpty();
+
+ /**
+ * Does the attribute with the provided name exist in this map?
+ * @param attributeName the attribute name
+ * @return true if so, false otherwise
+ */
+ boolean contains(String attributeName);
+
+ /**
+ * Does the attribute with the provided name exist in this map and is its value of the specified required type?
+ * @param attributeName the attribute name
+ * @param requiredType the required class of the attribute value
+ * @return true if so, false otherwise
+ * @throws IllegalArgumentException when the value is not of the required type
+ */
+ boolean contains(String attributeName, Class extends V> requiredType) throws IllegalArgumentException;
+
+ /**
+ * Get an attribute value, returning the default value if no value is found.
+ * @param attributeName the name of the attribute
+ * @param defaultValue the default value
+ * @return the attribute value, falling back to the default if no such attribute exists
+ */
+ V get(String attributeName, V defaultValue);
+
+ /**
+ * Get an attribute value, asserting the value is of the required type.
+ * @param attributeName the name of the attribute
+ * @param requiredType the required type of the attribute value
+ * @return the attribute value, or null if not found
+ * @throws IllegalArgumentException when the value is not of the required type
+ */
+ T get(String attributeName, Class requiredType) throws IllegalArgumentException;
+
+ /**
+ * Get an attribute value, asserting the value is of the required type and returning the default value if not found.
+ * @param attributeName the name of the attribute
+ * @param requiredType the value required type
+ * @param defaultValue the default value
+ * @return the attribute value, or the default if not found
+ * @throws IllegalArgumentException when the value (if found) is not of the required type
+ */
+ T get(String attributeName, Class requiredType, T defaultValue)
+ throws IllegalStateException;
+
+ /**
+ * Get the value of a required attribute, throwing an exception of no attribute is found.
+ * @param attributeName the name of the attribute
+ * @return the attribute value
+ * @throws IllegalArgumentException when the attribute is not found
+ */
+ V getRequired(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Get the value of a required attribute and make sure it is of the required type.
+ * @param attributeName name of the attribute to get
+ * @param requiredType the required type of the attribute value
+ * @return the attribute value
+ * @throws IllegalArgumentException when the attribute is not found or not of the required type
+ */
+ T getRequired(String attributeName, Class requiredType) throws IllegalArgumentException;
+
+ /**
+ * Returns a string attribute value in the map, returning null if no value was found.
+ * @param attributeName the attribute name
+ * @return the string attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a string
+ */
+ String getString(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns a string attribute value in the map, returning the default value if no value was found.
+ * @param attributeName the attribute name
+ * @param defaultValue the default
+ * @return the string attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a string
+ */
+ String getString(String attributeName, String defaultValue) throws IllegalArgumentException;
+
+ /**
+ * Returns a string attribute value in the map, throwing an exception if the attribute is not present and of the
+ * correct type.
+ * @param attributeName the attribute name
+ * @return the string attribute value
+ * @throws IllegalArgumentException if the attribute is not present or present but not a string
+ */
+ String getRequiredString(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns a collection attribute value in the map.
+ * @param attributeName the attribute name
+ * @return the collection attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a collection
+ */
+ Collection getCollection(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns a collection attribute value in the map and make sure it is of the required type.
+ * @param attributeName the attribute name
+ * @param requiredType the required type of the attribute value
+ * @return the collection attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a collection of the required type
+ */
+ > T getCollection(String attributeName, Class requiredType)
+ throws IllegalArgumentException;
+
+ /**
+ * Returns a collection attribute value in the map, throwing an exception if the attribute is not present or not a
+ * collection.
+ * @param attributeName the attribute name
+ * @return the collection attribute value
+ * @throws IllegalArgumentException if the attribute is not present or is present but not a collection
+ */
+ Collection getRequiredCollection(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns a collection attribute value in the map, throwing an exception if the attribute is not present or not a
+ * collection of the required type.
+ * @param attributeName the attribute name
+ * @param requiredType the required collection type
+ * @return the collection attribute value
+ * @throws IllegalArgumentException if the attribute is not present or is present but not a collection of the
+ * required type
+ */
+ > T getRequiredCollection(String attributeName, Class requiredType)
+ throws IllegalArgumentException;
+
+ /**
+ * Returns an array attribute value in the map and makes sure it is of the required type.
+ * @param attributeName the attribute name
+ * @param requiredType the required type of the attribute value
+ * @return the array attribute value
+ * @throws IllegalArgumentException if the attribute is present but not an array of the required type
+ */
+ T[] getArray(String attributeName, Class extends T[]> requiredType)
+ throws IllegalArgumentException;
+
+ /**
+ * Returns an array attribute value in the map, throwing an exception if the attribute is not present or not an
+ * array of the required type.
+ * @param attributeName the attribute name
+ * @param requiredType the required array type
+ * @return the collection attribute value
+ * @throws IllegalArgumentException if the attribute is not present or is present but not a array of the required
+ * type
+ */
+ T[] getRequiredArray(String attributeName, Class extends T[]> requiredType)
+ throws IllegalArgumentException;
+
+ /**
+ * Returns a number attribute value in the map that is of the specified type, returning null if no
+ * value was found.
+ * @param attributeName the attribute name
+ * @param requiredType the required number type
+ * @return the number attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a number of the required type
+ */
+ T getNumber(String attributeName, Class requiredType) throws IllegalArgumentException;
+
+ /**
+ * Returns a number attribute value in the map of the specified type, returning the default value if no value was
+ * found.
+ * @param attributeName the attribute name
+ * @param defaultValue the default
+ * @return the number attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a number of the required type
+ */
+ T getNumber(String attributeName, Class requiredType, T defaultValue)
+ throws IllegalArgumentException;
+
+ /**
+ * Returns a number attribute value in the map, throwing an exception if the attribute is not present and of the
+ * correct type.
+ * @param attributeName the attribute name
+ * @return the number attribute value
+ * @throws IllegalArgumentException if the attribute is not present or present but not a number of the required type
+ */
+ T getRequiredNumber(String attributeName, Class requiredType)
+ throws IllegalArgumentException;
+
+ /**
+ * Returns an integer attribute value in the map, returning null if no value was found.
+ * @param attributeName the attribute name
+ * @return the integer attribute value
+ * @throws IllegalArgumentException if the attribute is present but not an integer
+ */
+ Integer getInteger(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns an integer attribute value in the map, returning the default value if no value was found.
+ * @param attributeName the attribute name
+ * @param defaultValue the default
+ * @return the integer attribute value
+ * @throws IllegalArgumentException if the attribute is present but not an integer
+ */
+ Integer getInteger(String attributeName, Integer defaultValue) throws IllegalArgumentException;
+
+ /**
+ * Returns an integer attribute value in the map, throwing an exception if the attribute is not present and of the
+ * correct type.
+ * @param attributeName the attribute name
+ * @return the integer attribute value
+ * @throws IllegalArgumentException if the attribute is not present or present but not an integer
+ */
+ Integer getRequiredInteger(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns a long attribute value in the map, returning null if no value was found.
+ * @param attributeName the attribute name
+ * @return the long attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a long
+ */
+ Long getLong(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns a long attribute value in the map, returning the default value if no value was found.
+ * @param attributeName the attribute name
+ * @param defaultValue the default
+ * @return the long attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a long
+ */
+ Long getLong(String attributeName, Long defaultValue) throws IllegalArgumentException;
+
+ /**
+ * Returns a long attribute value in the map, throwing an exception if the attribute is not present and of the
+ * correct type.
+ * @param attributeName the attribute name
+ * @return the long attribute value
+ * @throws IllegalArgumentException if the attribute is not present or present but not a long
+ */
+ Long getRequiredLong(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns a boolean attribute value in the map, returning null if no value was found.
+ * @param attributeName the attribute name
+ * @return the long attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a boolean
+ */
+ Boolean getBoolean(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns a boolean attribute value in the map, returning the default value if no value was found.
+ * @param attributeName the attribute name
+ * @param defaultValue the default
+ * @return the boolean attribute value
+ * @throws IllegalArgumentException if the attribute is present but not a boolean
+ */
+ Boolean getBoolean(String attributeName, Boolean defaultValue) throws IllegalArgumentException;
+
+ /**
+ * Returns a boolean attribute value in the map, throwing an exception if the attribute is not present and of the
+ * correct type.
+ * @param attributeName the attribute name
+ * @return the boolean attribute value
+ * @throws IllegalArgumentException if the attribute is not present or present but is not a boolean
+ */
+ Boolean getRequiredBoolean(String attributeName) throws IllegalArgumentException;
+
+ /**
+ * Returns a new attribute map containing the union of this map with the provided map.
+ * @param attributes the map to combine with this map
+ * @return a new, combined map
+ */
+ AttributeMap union(AttributeMap extends V> attributes);
+
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMapBindingEvent.java b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMapBindingEvent.java
index 854a6d6f..46c9bdef 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMapBindingEvent.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMapBindingEvent.java
@@ -1,59 +1,59 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.core.collection;
-
-import java.util.EventObject;
-
-/**
- * Holder for information about the binding or unbinding event in an {@link AttributeMap}.
- *
- * @see AttributeMapBindingListener
- *
- * @author Ben Hale
- */
-public class AttributeMapBindingEvent extends EventObject {
-
- private String attributeName;
-
- private Object attributeValue;
-
- /**
- * Creates an event for map binding that contains information about the event.
- * @param source the source map that this attribute was bound in
- * @param attributeName the name that this attribute was bound with
- * @param attributeValue the attribute
- */
- public AttributeMapBindingEvent(AttributeMap> source, String attributeName, Object attributeValue) {
- super(source);
- this.source = source;
- this.attributeName = attributeName;
- this.attributeValue = attributeValue;
- }
-
- /**
- * Returns the name the attribute was bound with.
- */
- public String getAttributeName() {
- return attributeName;
- }
-
- /**
- * Returns the value of the attribute.
- */
- public Object getAttributeValue() {
- return attributeValue;
- }
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.core.collection;
+
+import java.util.EventObject;
+
+/**
+ * Holder for information about the binding or unbinding event in an {@link AttributeMap}.
+ *
+ * @see AttributeMapBindingListener
+ *
+ * @author Ben Hale
+ */
+public class AttributeMapBindingEvent extends EventObject {
+
+ private String attributeName;
+
+ private Object attributeValue;
+
+ /**
+ * Creates an event for map binding that contains information about the event.
+ * @param source the source map that this attribute was bound in
+ * @param attributeName the name that this attribute was bound with
+ * @param attributeValue the attribute
+ */
+ public AttributeMapBindingEvent(AttributeMap> source, String attributeName, Object attributeValue) {
+ super(source);
+ this.source = source;
+ this.attributeName = attributeName;
+ this.attributeValue = attributeValue;
+ }
+
+ /**
+ * Returns the name the attribute was bound with.
+ */
+ public String getAttributeName() {
+ return attributeName;
+ }
+
+ /**
+ * Returns the value of the attribute.
+ */
+ public Object getAttributeValue() {
+ return attributeValue;
+ }
}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMapBindingListener.java b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMapBindingListener.java
index a4de0f68..1ef5cf5a 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMapBindingListener.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/AttributeMapBindingListener.java
@@ -1,40 +1,40 @@
-/*
- * Copyright 2004-2008 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
- *
- * https://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.core.collection;
-
-/**
- * Causes an object to be notified when it is bound or unbound from an {@link AttributeMap}.
- *
- * Note that this is an optional feature and not all {@link AttributeMap} implementations support it.
- *
- * @see AttributeMap
- *
- * @author Ben Hale
- */
-public interface AttributeMapBindingListener {
-
- /**
- * Called when the implementing instance is bound into an AttributeMap.
- * @param event information about the binding event
- */
- void valueBound(AttributeMapBindingEvent event);
-
- /**
- * Called when the implementing instance is unbound from an AttributeMap.
- * @param event information about the unbinding event
- */
- void valueUnbound(AttributeMapBindingEvent event);
+/*
+ * Copyright 2004-2008 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
+ *
+ * https://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.core.collection;
+
+/**
+ * Causes an object to be notified when it is bound or unbound from an {@link AttributeMap}.
+ *
+ * Note that this is an optional feature and not all {@link AttributeMap} implementations support it.
+ *
+ * @see AttributeMap
+ *
+ * @author Ben Hale
+ */
+public interface AttributeMapBindingListener {
+
+ /**
+ * Called when the implementing instance is bound into an AttributeMap.
+ * @param event information about the binding event
+ */
+ void valueBound(AttributeMapBindingEvent event);
+
+ /**
+ * Called when the implementing instance is unbound from an AttributeMap.
+ * @param event information about the unbinding event
+ */
+ void valueUnbound(AttributeMapBindingEvent event);
}
\ No newline at end of file
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/CollectionUtils.java b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/CollectionUtils.java
index 376d1c50..547aa918 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/CollectionUtils.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/CollectionUtils.java
@@ -1,140 +1,140 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.core.collection;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A utility class for working with attribute and parameter collections used by Spring Web FLow.
- *
- * @author Keith Donald
- * @author Erwin Vervaet
- */
-public class CollectionUtils {
-
- /**
- * The shared, singleton empty iterator instance.
- */
- @SuppressWarnings("rawtypes")
- public static final Iterator EMPTY_ITERATOR = new EmptyIterator();
-
- /**
- * The shared, singleton empty attribute map instance.
- */
- public static final AttributeMap EMPTY_ATTRIBUTE_MAP = new LocalAttributeMap<>(Collections.emptyMap());
-
- /**
- * Private constructor to avoid instantiation.
- */
- private CollectionUtils() {
- }
-
- @SuppressWarnings("unchecked")
- public static Iterator emptyIterator() {
- return EMPTY_ITERATOR;
- }
-
- /**
- * Factory method that adapts an enumeration to an iterator.
- * @param enumeration the enumeration
- * @return the iterator
- */
- public static Iterator toIterator(Enumeration enumeration) {
- return new EnumerationIterator<>(enumeration);
- }
-
- /**
- * Factory method that returns a unmodifiable attribute map with a single entry.
- * @param attributeName the attribute name
- * @param attributeValue the attribute value
- * @return the unmodifiable map with a single element
- */
- public static AttributeMap singleEntryMap(String attributeName, V attributeValue) {
- return new LocalAttributeMap<>(attributeName, attributeValue);
- }
-
- /**
- * Add all given objects to given target list. No duplicates will be added. The contains() method of the given
- * target list will be used to determine whether or not an object is already in the list.
- * @param target the collection to which to objects will be added
- * @param objects the objects to add
- * @return whether or not the target collection changed
- */
- @SuppressWarnings("unchecked")
- public static boolean addAllNoDuplicates(List target, T... objects) {
- if (objects == null || objects.length == 0) {
- return false;
- } else {
- boolean changed = false;
- for (T object : objects) {
- if (!target.contains(object)) {
- target.add(object);
- changed = true;
- }
- }
- return changed;
- }
- }
-
- /**
- * Iterator iterating over no elements (hasNext() always returns false).
- */
- private static class EmptyIterator implements Iterator, Serializable {
-
- private EmptyIterator() {
- }
-
- public boolean hasNext() {
- return false;
- }
-
- public E next() {
- throw new UnsupportedOperationException("There are no elements");
- }
-
- public void remove() {
- throw new UnsupportedOperationException("There are no elements");
- }
- }
-
- /**
- * Iterator wrapping an Enumeration.
- */
- private static class EnumerationIterator implements Iterator {
-
- private Enumeration enumeration;
-
- public EnumerationIterator(Enumeration enumeration) {
- this.enumeration = enumeration;
- }
-
- public boolean hasNext() {
- return enumeration.hasMoreElements();
- }
-
- public E next() {
- return enumeration.nextElement();
- }
-
- public void remove() throws UnsupportedOperationException {
- throw new UnsupportedOperationException("Not supported");
- }
- }
-}
+/*
+ * Copyright 2004-2012 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
+ *
+ * https://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.core.collection;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * A utility class for working with attribute and parameter collections used by Spring Web FLow.
+ *
+ * @author Keith Donald
+ * @author Erwin Vervaet
+ */
+public class CollectionUtils {
+
+ /**
+ * The shared, singleton empty iterator instance.
+ */
+ @SuppressWarnings("rawtypes")
+ public static final Iterator EMPTY_ITERATOR = new EmptyIterator();
+
+ /**
+ * The shared, singleton empty attribute map instance.
+ */
+ public static final AttributeMap EMPTY_ATTRIBUTE_MAP = new LocalAttributeMap<>(Collections.emptyMap());
+
+ /**
+ * Private constructor to avoid instantiation.
+ */
+ private CollectionUtils() {
+ }
+
+ @SuppressWarnings("unchecked")
+ public static Iterator emptyIterator() {
+ return EMPTY_ITERATOR;
+ }
+
+ /**
+ * Factory method that adapts an enumeration to an iterator.
+ * @param enumeration the enumeration
+ * @return the iterator
+ */
+ public static Iterator toIterator(Enumeration enumeration) {
+ return new EnumerationIterator<>(enumeration);
+ }
+
+ /**
+ * Factory method that returns a unmodifiable attribute map with a single entry.
+ * @param attributeName the attribute name
+ * @param attributeValue the attribute value
+ * @return the unmodifiable map with a single element
+ */
+ public static AttributeMap singleEntryMap(String attributeName, V attributeValue) {
+ return new LocalAttributeMap<>(attributeName, attributeValue);
+ }
+
+ /**
+ * Add all given objects to given target list. No duplicates will be added. The contains() method of the given
+ * target list will be used to determine whether or not an object is already in the list.
+ * @param target the collection to which to objects will be added
+ * @param objects the objects to add
+ * @return whether or not the target collection changed
+ */
+ @SuppressWarnings("unchecked")
+ public static boolean addAllNoDuplicates(List target, T... objects) {
+ if (objects == null || objects.length == 0) {
+ return false;
+ } else {
+ boolean changed = false;
+ for (T object : objects) {
+ if (!target.contains(object)) {
+ target.add(object);
+ changed = true;
+ }
+ }
+ return changed;
+ }
+ }
+
+ /**
+ * Iterator iterating over no elements (hasNext() always returns false).
+ */
+ private static class EmptyIterator implements Iterator, Serializable {
+
+ private EmptyIterator() {
+ }
+
+ public boolean hasNext() {
+ return false;
+ }
+
+ public E next() {
+ throw new UnsupportedOperationException("There are no elements");
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException("There are no elements");
+ }
+ }
+
+ /**
+ * Iterator wrapping an Enumeration.
+ */
+ private static class EnumerationIterator implements Iterator {
+
+ private Enumeration enumeration;
+
+ public EnumerationIterator(Enumeration enumeration) {
+ this.enumeration = enumeration;
+ }
+
+ public boolean hasNext() {
+ return enumeration.hasMoreElements();
+ }
+
+ public E next() {
+ return enumeration.nextElement();
+ }
+
+ public void remove() throws UnsupportedOperationException {
+ throw new UnsupportedOperationException("Not supported");
+ }
+ }
+}
diff --git a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/LocalAttributeMap.java b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/LocalAttributeMap.java
index 2816d100..935546d4 100644
--- a/spring-webflow/src/main/java/org/springframework/webflow/core/collection/LocalAttributeMap.java
+++ b/spring-webflow/src/main/java/org/springframework/webflow/core/collection/LocalAttributeMap.java
@@ -1,344 +1,344 @@
-/*
- * Copyright 2004-2012 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
- *
- * https://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.core.collection;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.springframework.binding.collection.MapAccessor;
-import org.springframework.core.style.StylerUtils;
-import org.springframework.util.Assert;
-
-/**
- * A generic, mutable attribute map with string keys.
- *
- * @author Keith Donald
- */
-public class LocalAttributeMap implements MutableAttributeMap, Serializable {
-
- /**
- * The backing map storing the attributes.
- */
- private Map attributes;
-
- /**
- * A helper for accessing attributes. Marked transient and restored on deserialization.
- */
- private transient MapAccessor attributeAccessor;
-
- /**
- * Creates a new attribute map, initially empty.
- */
- public LocalAttributeMap() {
- initAttributes(createTargetMap());
- }
-
- /**
- * Creates a new attribute map, initially empty.
- * @param size the initial size
- * @param loadFactor the load factor
- */
- public LocalAttributeMap(int size, int loadFactor) {
- initAttributes(createTargetMap(size, loadFactor));
- }
-
- /**
- * Creates a new attribute map with a single entry.
- */
- public LocalAttributeMap(String attributeName, V attributeValue) {
- initAttributes(createTargetMap(1, 1));
- put(attributeName, attributeValue);
- }
-
- /**
- * Creates a new attribute map wrapping the specified map.
- */
- public LocalAttributeMap(Map map) {
- Assert.notNull(map, "The target map is required");
- initAttributes(map);
- }
-
- // implementing attribute map
-
- public Map asMap() {
- return attributeAccessor.asMap();
- }
-
- public int size() {
- return attributes.size();
- }
-
- public V get(String attributeName) {
- return attributes.get(attributeName);
- }
-
- public boolean isEmpty() {
- return attributes.isEmpty();
- }
-
- public boolean contains(String attributeName) {
- return attributes.containsKey(attributeName);
- }
-
- public boolean contains(String attributeName, Class extends V> requiredType) throws IllegalArgumentException {
- return attributeAccessor.containsKey(attributeName, requiredType);
- }
-
- public V get(String attributeName, V defaultValue) {
- return attributeAccessor.get(attributeName, defaultValue);
- }
-
- public T get(String attributeName, Class requiredType) throws IllegalArgumentException {
- return attributeAccessor.get(attributeName, requiredType);
- }
-
- public T get(String attributeName, Class requiredType, T defaultValue)
- throws IllegalStateException {
- return attributeAccessor.get(attributeName, requiredType, defaultValue);
- }
-
- public V getRequired(String attributeName) throws IllegalArgumentException {
- return attributeAccessor.getRequired(attributeName);
- }
-
- public T getRequired(String attributeName, Class requiredType) throws IllegalArgumentException {
- return attributeAccessor.getRequired(attributeName, requiredType);
- }
-
- public String getString(String attributeName) throws IllegalArgumentException {
- return attributeAccessor.getString(attributeName);
- }
-
- public String getString(String attributeName, String defaultValue) throws IllegalArgumentException {
- return attributeAccessor.getString(attributeName, defaultValue);
- }
-
- public String getRequiredString(String attributeName) throws IllegalArgumentException {
- return attributeAccessor.getRequiredString(attributeName);
- }
-
- public Collection getCollection(String attributeName) throws IllegalArgumentException {
- return attributeAccessor.getCollection(attributeName);
- }
-
- public > T getCollection(String attributeName, Class requiredType)
- throws IllegalArgumentException {
- return attributeAccessor.getCollection(attributeName, requiredType);
- }
-
- public Collection getRequiredCollection(String attributeName) throws IllegalArgumentException {
- return attributeAccessor.getRequiredCollection(attributeName);
- }
-
- public > T getRequiredCollection(String attributeName, Class requiredType)
- throws IllegalArgumentException {
- return attributeAccessor.getRequiredCollection(attributeName, requiredType);
- }
-
- public T[] getArray(String attributeName, Class extends T[]> requiredType)
- throws IllegalArgumentException {
- return attributeAccessor.getArray(attributeName, requiredType);
- }
-
- public T[] getRequiredArray(String attributeName, Class extends T[]> requiredType)
- throws IllegalArgumentException {
- return attributeAccessor.getRequiredArray(attributeName, requiredType);
- }
-
- public T getNumber(String attributeName, Class requiredType) throws IllegalArgumentException {
- return attributeAccessor.getNumber(attributeName, requiredType);
- }
-
- public T getNumber(String attributeName, Class requiredType, T defaultValue)
- throws IllegalArgumentException {
- return attributeAccessor.getNumber(attributeName, requiredType, defaultValue);
- }
-
- public