You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by jl...@apache.org on 2007/10/25 19:10:56 UTC
svn commit: r588283 [3/18] - in /incubator/cxf/branches/jliu: ./ api/
api/src/main/java/org/apache/cxf/databinding/
api/src/main/java/org/apache/cxf/io/
api/src/main/java/org/apache/cxf/message/
api/src/main/java/org/apache/cxf/phase/ api/src/main/java...
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/logging/LogUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/logging/LogUtils.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/logging/LogUtils.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/logging/LogUtils.java Thu Oct 25 10:09:20 2007
@@ -19,6 +19,11 @@
package org.apache.cxf.common.logging;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
@@ -27,14 +32,19 @@
import java.util.logging.Logger;
import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.common.util.StringUtils;
/**
* A container for static utility methods related to logging.
*/
public final class LogUtils {
+ public static final String KEY = "org.apache.cxf.Logger";
private static final Object[] NO_PARAMETERS = new Object[0];
+
+
+ private static Class<?> loggerClass;
/**
* Prevents instantiation.
@@ -42,6 +52,74 @@
private LogUtils() {
}
+ static {
+ try {
+ String cname = System.getProperty(KEY);
+ if (StringUtils.isEmpty(cname)) {
+ InputStream ins = Thread.currentThread().getContextClassLoader()
+ .getResourceAsStream("META-INF/cxf/" + KEY);
+ if (ins == null) {
+ ins = ClassLoader.getSystemResourceAsStream("META-INF/cxf/" + KEY);
+ }
+ if (ins != null) {
+ BufferedReader din = new BufferedReader(new InputStreamReader(ins));
+ cname = din.readLine();
+ }
+ }
+ if (!StringUtils.isEmpty(cname)) {
+ loggerClass = Class.forName(cname, true,
+ Thread.currentThread().getContextClassLoader());
+ getLogger(LogUtils.class).fine("Using " + loggerClass.getName() + " for logging.");
+ }
+ } catch (Exception ex) {
+ //ignore
+ }
+ }
+
+
+ /**
+ * Enable users to use their own logger implementation.
+ */
+ public static void setLoggerClass(Class<?> cls) {
+ loggerClass = cls;
+ }
+
+
+ /**
+ * Get a Logger with the associated default resource bundle for the class.
+ *
+ * @param cls the Class to contain the Logger
+ * @return an appropriate Logger
+ */
+ public static Logger getLogger(Class<?> cls) {
+ return createLogger(cls, null, cls.getName());
+ }
+
+ /**
+ * Get a Logger with an associated resource bundle.
+ *
+ * @param cls the Class to contain the Logger
+ * @param name the resource name
+ * @return an appropriate Logger
+ */
+ public static Logger getLogger(Class<?> cls, String resourcename) {
+ return createLogger(cls, resourcename, cls.getName());
+ }
+
+ /**
+ * Get a Logger with an associated resource bundle.
+ *
+ * @param cls the Class to contain the Logger (to find resources)
+ * @param name the resource name
+ * @param loggerName the full name for the logger
+ * @return an appropriate Logger
+ */
+ public static Logger getLogger(Class<?> cls,
+ String resourcename,
+ String loggerName) {
+ return createLogger(cls, resourcename, loggerName);
+ }
+
/**
* Get a Logger with the associated default resource bundle for the class.
*
@@ -49,11 +127,7 @@
* @return an appropriate Logger
*/
public static Logger getL7dLogger(Class<?> cls) {
- try {
- return Logger.getLogger(cls.getName(), BundleUtils.getBundleName(cls));
- } catch (MissingResourceException rex) {
- return Logger.getLogger(cls.getName());
- }
+ return createLogger(cls, null, cls.getName());
}
/**
@@ -63,8 +137,67 @@
* @param name the resource name
* @return an appropriate Logger
*/
- public static Logger getL7dLogger(Class<?> cls, String name) {
- return Logger.getLogger(cls.getName(), BundleUtils.getBundleName(cls, name));
+ public static Logger getL7dLogger(Class<?> cls, String resourcename) {
+ return createLogger(cls, resourcename, cls.getName());
+ }
+
+ /**
+ * Get a Logger with an associated resource bundle.
+ *
+ * @param cls the Class to contain the Logger (to find resources)
+ * @param name the resource name
+ * @param loggerName the full name for the logger
+ * @return an appropriate Logger
+ */
+ public static Logger getL7dLogger(Class<?> cls,
+ String resourcename,
+ String loggerName) {
+ return createLogger(cls, resourcename, loggerName);
+ }
+
+ /**
+ * Create a logger
+ */
+ protected static Logger createLogger(Class<?> cls,
+ String name,
+ String loggerName) {
+ if (loggerClass != null) {
+ try {
+ Constructor cns = loggerClass.getConstructor(String.class, String.class);
+ if (name == null) {
+ try {
+ return (Logger) cns.newInstance(loggerName, BundleUtils.getBundleName(cls));
+ } catch (InvocationTargetException ite) {
+ if (ite.getTargetException() instanceof MissingResourceException) {
+ return (Logger) cns.newInstance(loggerName, null);
+ } else {
+ throw ite;
+ }
+ }
+ } else {
+ try {
+ return (Logger) cns.newInstance(loggerName, BundleUtils.getBundleName(cls, name));
+ } catch (InvocationTargetException ite) {
+ if (ite.getTargetException() instanceof MissingResourceException) {
+ throw (MissingResourceException)ite.getTargetException();
+ } else {
+ throw ite;
+ }
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ if (name == null) {
+ try {
+ return Logger.getLogger(loggerName, BundleUtils.getBundleName(cls)); //NOPMD
+ } catch (MissingResourceException rex) {
+ return Logger.getLogger(loggerName, null); //NOPMD
+ }
+ } else {
+ return Logger.getLogger(loggerName, BundleUtils.getBundleName(cls, name)); //NOPMD
+ }
}
/**
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/util/ParamReader.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/util/ParamReader.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/util/ParamReader.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/util/ParamReader.java Thu Oct 25 10:09:20 2007
@@ -132,7 +132,7 @@
try {
// get a parameter reader
ParamReader pr = new ParamReader(c);
- // get the paramter names
+ // get the parameter names
return pr.getParameterNames(method);
} catch (IOException e) {
// log it and leave
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java Thu Oct 25 10:09:20 2007
@@ -31,20 +31,51 @@
public static List<String> getPackagesFromJar(File jarFile) throws IOException {
List<String> packageNames = new ArrayList<String>();
- JarResource resource = new JarResource();
- for (String item : resource.getJarContents(jarFile)) {
- if (!item.endsWith(".class")) {
- continue;
- }
- String packageName = getPackageName(item);
- if (!packageNames.contains(packageName)) {
- packageNames.add(packageName);
+ if (jarFile.isDirectory()) {
+ getPackageNamesFromDir(jarFile, jarFile, packageNames);
+ } else {
+ JarResource resource = new JarResource();
+ for (String item : resource.getJarContents(jarFile)) {
+ if (!item.endsWith(".class")) {
+ continue;
+ }
+ String packageName = getPackageName(item);
+ if (!StringUtils.isEmpty(packageName)
+ && !packageNames.contains(packageName)) {
+ packageNames.add(packageName);
+ }
}
}
return packageNames;
}
+
+ private static void getPackageNamesFromDir(File base, File dir, List<String> pkgs) {
+ boolean foundClass = false;
+ for (File file : dir.listFiles()) {
+ if (file.isDirectory()) {
+ getPackageNamesFromDir(base, file, pkgs);
+ } else if (!foundClass && file.getName().endsWith(".class")) {
+ foundClass = true;
+ String pkg = "";
+ file = dir;
+ while (!file.equals(base)) {
+ if (!"".equals(pkg)) {
+ pkg = "." + pkg;
+ }
+ pkg = file.getName() + pkg;
+ file = file.getParentFile();
+ }
+ if (!pkgs.contains(pkg)) {
+ pkgs.add(pkg);
+ }
+ }
+ }
+ }
private static String getPackageName(String clzName) {
+ if (clzName.indexOf("/") == -1) {
+ return null;
+ }
String packageName = clzName.substring(0, clzName.lastIndexOf("/"));
return packageName.replace("/", ".");
}
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/AbstractBeanDefinitionParser.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/AbstractBeanDefinitionParser.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/AbstractBeanDefinitionParser.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/AbstractBeanDefinitionParser.java Thu Oct 25 10:09:20 2007
@@ -64,6 +64,12 @@
String val = node.getValue();
String pre = node.getPrefix();
String name = node.getLocalName();
+ String prefix = node.getPrefix();
+
+ // Don't process namespaces
+ if (isNamespace(name, prefix)) {
+ continue;
+ }
if ("createdFromAPI".equals(name)) {
bean.setAbstract(true);
@@ -84,6 +90,10 @@
}
}
return setBus;
+ }
+
+ private boolean isNamespace(String name, String prefix) {
+ return "xmlns".equals(prefix) || prefix == null && "xmlns".equals(name);
}
protected void parseChildElements(Element element, ParserContext ctx, BeanDefinitionBuilder bean) {
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/SpringBeanMap.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/SpringBeanMap.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/SpringBeanMap.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/SpringBeanMap.java Thu Oct 25 10:09:20 2007
@@ -18,50 +18,26 @@
*/
package org.apache.cxf.configuration.spring;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.cxf.helpers.CastUtils;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.BeansException;
+
import org.springframework.beans.Mergeable;
import org.springframework.beans.PropertyValue;
-import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.BeanIsAbstractException;
-import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.TypedStringValue;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.ManagedSet;
import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
-public class SpringBeanMap<V> implements ApplicationContextAware, InitializingBean, Map<String, V> {
- private ApplicationContext context;
- private Class<?> type;
- private String idsProperty;
- private Map<String, String> idToBeanName = new ConcurrentHashMap<String, String>();
- private Map<String, V> putStore = new ConcurrentHashMap<String, V>();
-
- public void setApplicationContext(ApplicationContext ctx) throws BeansException {
- this.context = ctx;
- }
-
- public void afterPropertiesSet() throws Exception {
- processBeans(context);
- }
+public class SpringBeanMap<V>
+ extends AbstractSpringBeanMap<String, V> {
- private void processBeans(ApplicationContext beanFactory) {
+
+ protected void processBeans(ApplicationContext beanFactory) {
if (beanFactory == null) {
return;
}
@@ -117,7 +93,7 @@
ids = newIds;
}
for (Object id : ids) {
- idToBeanName.put(id.toString(), beanNames[i]);
+ getBeanListForId(id.toString()).add(beanNames[i]);
}
} catch (BeanIsAbstractException e) {
// The bean is abstract, we won't be doing anything with it.
@@ -126,140 +102,5 @@
}
processBeans(ctxt.getParent());
- }
-
- private Collection<String> getIds(Object bean) {
- try {
- PropertyDescriptor pd = BeanUtils.getPropertyDescriptor(bean.getClass(), idsProperty);
- Method method = pd.getReadMethod();
- Collection<String> c = CastUtils.cast((Collection<?>)method.invoke(bean, new Object[0]));
-
- return c;
- } catch (IllegalArgumentException e) {
- throw new BeanInitializationException("Could not retrieve ids.", e);
- } catch (IllegalAccessException e) {
- throw new BeanInitializationException("Could not access id getter.", e);
- } catch (InvocationTargetException e) {
- throw new BeanInitializationException("Could not invoke id getter.", e);
- } catch (SecurityException e) {
- throw new BeanInitializationException("Could not invoke id getter.", e);
- }
- }
-
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- return bean;
- }
-
- public Class<?> getType() {
- return type;
- }
-
- public void setType(Class<?> type) {
- this.type = type;
- }
-
- public String getIdsProperty() {
- return idsProperty;
- }
-
- public void setIdsProperty(String idsProperty) {
- this.idsProperty = idsProperty;
- }
-
- public void clear() {
- throw new UnsupportedOperationException();
- }
-
- public boolean containsKey(Object key) {
- return idToBeanName.containsKey(key) || putStore.containsKey(key);
- }
-
- public boolean containsValue(Object arg0) {
- throw new UnsupportedOperationException();
- }
-
- public Set<java.util.Map.Entry<String, V>> entrySet() {
- Set<Map.Entry<String, V>> entries = new HashSet<Map.Entry<String, V>>();
- for (String k : keySet()) {
- entries.add(new Entry<V>(this, k));
- }
- return entries;
- }
-
- @SuppressWarnings("unchecked")
- public V get(Object key) {
- String name = idToBeanName.get(key);
- if (name != null) {
- return (V)context.getBean(name);
- } else {
- return putStore.get(key);
- }
- }
-
- public boolean isEmpty() {
- return idToBeanName.isEmpty() && putStore.isEmpty();
- }
-
- public Set<String> keySet() {
- Set<String> keys = new HashSet<String>();
- keys.addAll(idToBeanName.keySet());
- keys.addAll(putStore.keySet());
- return keys;
- }
-
- public V put(String key, V value) {
- // Make sure we don't take the key from Spring any more
- idToBeanName.remove(key);
- return putStore.put(key, value);
- }
-
- public void putAll(Map<? extends String, ? extends V> m) {
- putStore.putAll(m);
- }
-
- public V remove(Object key) {
- V v = get(key);
- if (v != null) {
- idToBeanName.remove(key);
- } else {
- v = putStore.get(key);
- }
-
- return v;
- }
-
- public int size() {
- return idToBeanName.size() + putStore.size();
- }
-
- public Collection<V> values() {
- List<V> values = new ArrayList<V>();
- values.addAll(putStore.values());
- for (String id : idToBeanName.keySet()) {
- values.add(get(id));
- }
- return values;
- }
-
- public static class Entry<V> implements Map.Entry<String, V> {
- private SpringBeanMap<V> map;
- private String key;
-
- public Entry(SpringBeanMap<V> map, String key) {
- this.map = map;
- this.key = key;
- }
-
- public String getKey() {
- return key;
- }
-
- public V getValue() {
- return map.get(key);
- }
-
- public V setValue(V value) {
- return map.put(key, value);
- }
}
}
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/SpringBeanQNameMap.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/SpringBeanQNameMap.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/SpringBeanQNameMap.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/configuration/spring/SpringBeanQNameMap.java Thu Oct 25 10:09:20 2007
@@ -18,49 +18,23 @@
*/
package org.apache.cxf.configuration.spring;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
import javax.xml.namespace.QName;
-import org.apache.cxf.helpers.CastUtils;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.BeansException;
import org.springframework.beans.Mergeable;
import org.springframework.beans.PropertyValue;
-import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.BeanIsAbstractException;
-import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanReference;
import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
-public class SpringBeanQNameMap<V> implements ApplicationContextAware, InitializingBean, Map<QName, V> {
- private ApplicationContext context;
- private Class<?> type;
- private String idsProperty;
- private Map<QName, String> idToBeanName = new ConcurrentHashMap<QName, String>();
- private Map<QName, V> putStore = new ConcurrentHashMap<QName, V>();
+public class SpringBeanQNameMap<V>
+ extends AbstractSpringBeanMap<QName, V> {
- public void setApplicationContext(ApplicationContext ctx) throws BeansException {
- this.context = ctx;
- }
-
- public void afterPropertiesSet() throws Exception {
- processBeans(context);
- }
-
- private void processBeans(ApplicationContext beanFactory) {
+ protected void processBeans(ApplicationContext beanFactory) {
if (beanFactory == null) {
return;
}
@@ -129,7 +103,7 @@
for (Object id : ids) {
QName key = (QName)id;
- idToBeanName.put(key, beanNames[i]);
+ getBeanListForId(key).add(beanNames[i]);
}
} catch (BeanIsAbstractException e) {
// The bean is abstract, we won't be doing anything with it.
@@ -140,139 +114,4 @@
processBeans(ctxt.getParent());
}
- private Collection<QName> getIds(Object bean) {
- try {
- PropertyDescriptor pd = BeanUtils.getPropertyDescriptor(bean.getClass(), idsProperty);
- Method method = pd.getReadMethod();
- Collection<QName> c = CastUtils.cast((Collection<?>)method.invoke(bean, new Object[0]),
- QName.class);
-
- return c;
- } catch (IllegalArgumentException e) {
- throw new BeanInitializationException("Could not retrieve ids.", e);
- } catch (IllegalAccessException e) {
- throw new BeanInitializationException("Could not access id getter.", e);
- } catch (InvocationTargetException e) {
- throw new BeanInitializationException("Could not invoke id getter.", e);
- } catch (SecurityException e) {
- throw new BeanInitializationException("Could not invoke id getter.", e);
- }
- }
-
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- return bean;
- }
-
- public Class<?> getType() {
- return type;
- }
-
- public void setType(Class<?> type) {
- this.type = type;
- }
-
- public String getIdsProperty() {
- return idsProperty;
- }
-
- public void setIdsProperty(String idsProperty) {
- this.idsProperty = idsProperty;
- }
-
- public void clear() {
- throw new UnsupportedOperationException();
- }
-
- public boolean containsKey(Object key) {
- return idToBeanName.containsKey(key) || putStore.containsKey(key);
- }
-
- public boolean containsValue(Object arg0) {
- throw new UnsupportedOperationException();
- }
-
- public Set<java.util.Map.Entry<QName, V>> entrySet() {
- Set<Map.Entry<QName, V>> entries = new HashSet<Map.Entry<QName, V>>();
- for (QName k : keySet()) {
- entries.add(new Entry<V>(this, k));
- }
- return entries;
- }
-
- @SuppressWarnings("unchecked")
- public V get(Object key) {
- String name = idToBeanName.get(key);
- if (name != null) {
- return (V)(context.getBean(name));
- } else {
- return putStore.get(key);
- }
- }
-
- public boolean isEmpty() {
- return idToBeanName.isEmpty() && putStore.isEmpty();
- }
-
- public Set<QName> keySet() {
- Set<QName> keys = new HashSet<QName>();
- keys.addAll(idToBeanName.keySet());
- keys.addAll(putStore.keySet());
- return keys;
- }
-
- public V put(QName key, V value) {
- // Make sure we don't take the key from Spring any more
- idToBeanName.remove(key);
- return putStore.put(key, value);
- }
-
- public void putAll(Map<? extends QName, ? extends V> m) {
- putStore.putAll(m);
- }
-
- public V remove(Object key) {
- V v = get(key);
- if (v != null) {
- idToBeanName.remove(key);
- } else {
- v = putStore.get(key);
- }
-
- return v;
- }
-
- public int size() {
- return idToBeanName.size() + putStore.size();
- }
-
- public Collection<V> values() {
- List<V> values = new ArrayList<V>();
- values.addAll(putStore.values());
- for (QName id : idToBeanName.keySet()) {
- values.add(get(id));
- }
- return values;
- }
-
- public static class Entry<V> implements Map.Entry<QName, V> {
- private SpringBeanQNameMap<V> map;
- private QName key;
-
- public Entry(SpringBeanQNameMap<V> map, QName key) {
- this.map = map;
- this.key = key;
- }
-
- public QName getKey() {
- return key;
- }
-
- public V getValue() {
- return map.get(key);
- }
-
- public V setValue(V value) {
- return map.put(key, value);
- }
- }
}
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/FileUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/FileUtils.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/FileUtils.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/FileUtils.java Thu Oct 25 10:09:20 2007
@@ -20,18 +20,47 @@
package org.apache.cxf.helpers;
import java.io.File;
-import java.text.DecimalFormat;
+import java.io.IOException;
import java.util.Locale;
-import java.util.Random;
public final class FileUtils {
private static final int RETRY_SLEEP_MILLIS = 10;
- private static Random rand = new Random(System.currentTimeMillis()
- + Runtime.getRuntime().freeMemory());
-
+ private static File defaultTempDir;
+
+
private FileUtils() {
}
+
+ private static synchronized File getDefaultTempDir() {
+ if (defaultTempDir != null) {
+ return defaultTempDir;
+ }
+ String s = System.getProperty(FileUtils.class.getName() + ".TempDirectory");
+ if (s == null) {
+ int x = (int)(Math.random() * 1000000);
+ s = System.getProperty("java.io.tmpdir");
+ File f = new File(s, "cxf-tmp-" + x);
+ while (!f.mkdir()) {
+ x = (int)(Math.random() * 1000000);
+ f = new File(s, "cxf-tmp-" + x);
+ }
+ defaultTempDir = f;
+ Thread hook = new Thread() {
+ @Override
+ public void run() {
+ removeDir(defaultTempDir);
+ }
+ };
+ Runtime.getRuntime().addShutdownHook(hook);
+ } else {
+ //assume someone outside of us will manage the directory
+ File f = new File(s);
+ f.mkdirs();
+ defaultTempDir = f;
+ }
+ return defaultTempDir;
+ }
public static void mkDir(File dir) {
if (dir == null) {
@@ -108,26 +137,31 @@
return osName.indexOf("windows") > -1;
}
- public static File createTempFile(String prefix, String suffix) {
- return createTempFile(prefix, suffix, null, true);
+ public static File createTempFile(String prefix, String suffix) throws IOException {
+ return createTempFile(prefix, suffix, null, false);
}
-
+
public static File createTempFile(String prefix, String suffix, File parentDir,
- boolean deleteOnExit) {
+ boolean deleteOnExit) throws IOException {
File result = null;
- String parent = (parentDir == null)
- ? System.getProperty("java.io.tmpdir")
- : parentDir.getPath();
-
- DecimalFormat fmt = new DecimalFormat("#####");
- synchronized (rand) {
- do {
- result = new File(parent,
- prefix + fmt.format(Math.abs(rand.nextInt()))
- + suffix);
- } while (result.exists());
- }
- if (deleteOnExit) {
+ File parent = (parentDir == null)
+ ? getDefaultTempDir()
+ : parentDir;
+
+ if (suffix == null) {
+ suffix = ".tmp";
+ }
+ if (prefix == null) {
+ prefix = "cxf";
+ } else if (prefix.length() < 3) {
+ prefix = prefix + "cxf";
+ }
+ result = File.createTempFile(prefix, suffix, parent);
+
+ //if parentDir is null, we're in our default dir
+ //which will get completely wiped on exit from our exit
+ //hook. No need to set deleteOnExit() which leaks memory.
+ if (deleteOnExit && parentDir != null) {
result.deleteOnExit();
}
return result;
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/HttpHeaderHelper.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/HttpHeaderHelper.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/HttpHeaderHelper.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/HttpHeaderHelper.java Thu Oct 25 10:09:20 2007
@@ -19,9 +19,11 @@
package org.apache.cxf.helpers;
+import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
public final class HttpHeaderHelper {
@@ -37,6 +39,7 @@
private static Map<String, String> internalHeaders = new HashMap<String, String>();
+ private static Map<String, String> encodings = new ConcurrentHashMap<String, String>();
static {
internalHeaders.put("Content-Type", "content-type");
@@ -61,5 +64,23 @@
} else {
return key;
}
+ }
+
+ //helper to map the charsets that various things send in the http Content-Type header
+ //into something that is actually supported by Java and the Stax parsers and such.
+ public static String mapCharset(String enc) {
+ if (enc == null) {
+ return null;
+ }
+ String newenc = encodings.get(enc);
+ if (newenc == null) {
+ try {
+ newenc = Charset.forName(enc).name();
+ } catch (Exception ex) {
+ //ignore
+ }
+ encodings.put(enc, newenc);
+ }
+ return newenc == null ? enc : newenc;
}
}
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/IOUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/IOUtils.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/IOUtils.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/helpers/IOUtils.java Thu Oct 25 10:09:20 2007
@@ -19,6 +19,7 @@
package org.apache.cxf.helpers;
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -39,7 +40,24 @@
return copy(input, output, DEFAULT_BUFFER_SIZE);
}
-
+ public static int copyAndCloseInput(final InputStream input, final OutputStream output)
+ throws IOException {
+ try {
+ return copy(input, output, DEFAULT_BUFFER_SIZE);
+ } finally {
+ input.close();
+ }
+ }
+ public static int copyAndCloseInput(final InputStream input,
+ final OutputStream output,
+ int bufferSize)
+ throws IOException {
+ try {
+ return copy(input, output, bufferSize);
+ } finally {
+ input.close();
+ }
+ }
public static int copy(final InputStream input,
final OutputStream output,
int bufferSize)
@@ -79,7 +97,7 @@
public static String toString(final InputStream input)
throws IOException {
- StringBuffer buf = new StringBuffer();
+ StringBuilder buf = new StringBuilder();
final byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int n = 0;
n = input.read(buffer);
@@ -87,12 +105,13 @@
buf.append(new String(buffer, 0, n));
n = input.read(buffer);
}
+ input.close();
return buf.toString();
}
public static String toString(final Reader input)
throws IOException {
- StringBuffer buf = new StringBuffer();
+ StringBuilder buf = new StringBuilder();
final char[] buffer = new char[DEFAULT_BUFFER_SIZE];
int n = 0;
n = input.read(buffer);
@@ -100,6 +119,7 @@
buf.append(new String(buffer, 0, n));
n = input.read(buffer);
}
+ input.close();
return buf.toString();
}
@@ -115,17 +135,33 @@
return sb.toString();
}
+
+ /**
+ * Load the InputStream into memory and return a ByteArrayInputStream that
+ * represents it. Closes the in stream.
+ * @param in
+ * @return
+ * @throws IOException
+ */
+ public static ByteArrayInputStream loadIntoBAIS(InputStream in) throws IOException {
+ int i = in.available();
+ if (i < DEFAULT_BUFFER_SIZE) {
+ i = DEFAULT_BUFFER_SIZE;
+ }
+ LoadingByteArrayOutputStream bout = new LoadingByteArrayOutputStream(i);
+ copy(in, bout);
+ in.close();
+ return bout.createInputStream();
+ }
public static byte[] readBytesFromStream(InputStream in) throws IOException {
-
- ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
-
- for (int i = in.read(); i != -1; i = in.read()) {
- bos.write(i);
+ int i = in.available();
+ if (i < DEFAULT_BUFFER_SIZE) {
+ i = DEFAULT_BUFFER_SIZE;
}
-
+ ByteArrayOutputStream bos = new ByteArrayOutputStream(i);
+ copy(in, bos);
in.close();
-
return bos.toByteArray();
}
}
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/resource/DefaultResourceManager.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/resource/DefaultResourceManager.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/resource/DefaultResourceManager.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/resource/DefaultResourceManager.java Thu Oct 25 10:09:20 2007
@@ -81,6 +81,9 @@
private <T> T findResource(String name, Class<T> type, boolean asStream,
List<ResourceResolver> resolvers) {
+ if (resolvers == null) {
+ resolvers = registeredResolvers;
+ }
if (LOG.isLoggable(Level.FINE)) {
LOG.fine("resolving resource <" + name + ">" + (asStream ? " as stream "
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/resource/ExtendedURIResolver.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/resource/ExtendedURIResolver.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/resource/ExtendedURIResolver.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/resource/ExtendedURIResolver.java Thu Oct 25 10:09:20 2007
@@ -66,13 +66,13 @@
}
public void close() {
- try {
- while (!resourceOpened.isEmpty()) {
+ while (!resourceOpened.isEmpty()) {
+ try {
InputStream in = resourceOpened.pop();
in.close();
+ } catch (IOException ioe) {
+ // move on...
}
- } catch (IOException ioe) {
- // move on...
}
}
Modified: incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/version/Version.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/version/Version.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/version/Version.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/java/org/apache/cxf/version/Version.java Thu Oct 25 10:09:20 2007
@@ -25,6 +25,7 @@
public final class Version {
private static String version;
+ private static String name;
private static final String VERSION_BASE = "/org/apache/cxf/version/";
@@ -47,14 +48,14 @@
try {
InputStream ins = getResourceAsStream(VERSION_BASE + "version.properties");
-
p.load(ins);
ins.close();
} catch (IOException ex) {
// ignore, will end up with defaults
}
- version = p.getProperty("product.version");
+ version = p.getProperty("product.version", "<unknown>");
+ name = p.getProperty("product.name", "Apache CXF");
}
}
@@ -63,12 +64,17 @@
return version;
}
+ public static String getName() {
+ loadProperties();
+ return name;
+ }
/**
- * Returns version string as normally used in print, such as 3.2.4
+ * Returns version string as normally used in print, such as Apache CXF 3.2.4
*
*/
public static String getCompleteVersionString() {
- return getCurrentVersion();
+ loadProperties();
+ return name + " " + version;
}
}
Modified: incubator/cxf/branches/jliu/common/common/src/main/resources-filtered/org/apache/cxf/version/version.properties
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/main/resources-filtered/org/apache/cxf/version/version.properties?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/main/resources-filtered/org/apache/cxf/version/version.properties (original)
+++ incubator/cxf/branches/jliu/common/common/src/main/resources-filtered/org/apache/cxf/version/version.properties Thu Oct 25 10:09:20 2007
@@ -19,3 +19,4 @@
#
#
product.version=${pom.version}
+product.name=Apache CXF (incubator)
\ No newline at end of file
Modified: incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/annotation/AnnotatedGreeterImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/annotation/AnnotatedGreeterImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/annotation/AnnotatedGreeterImpl.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/annotation/AnnotatedGreeterImpl.java Thu Oct 25 10:09:20 2007
@@ -31,13 +31,15 @@
import javax.xml.ws.ResponseWrapper;
import javax.xml.ws.WebServiceContext;
+import org.apache.cxf.common.logging.LogUtils;
+
@javax.jws.WebService(name = "Greeter", serviceName = "SOAPService",
targetNamespace = "http://apache.org/hello_world_soap_http")
@HandlerChain(name = "TestHandlerChain", file = "handlers.xml")
public class AnnotatedGreeterImpl {
private static final Logger LOG =
- Logger.getLogger(AnnotatedGreeterImpl.class.getName());
+ LogUtils.getL7dLogger(AnnotatedGreeterImpl.class);
@Resource
private int foo;
Modified: incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/injection/ResourceInjectorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/injection/ResourceInjectorTest.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/injection/ResourceInjectorTest.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/injection/ResourceInjectorTest.java Thu Oct 25 10:09:20 2007
@@ -19,7 +19,11 @@
package org.apache.cxf.common.injection;
-
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
@@ -29,6 +33,10 @@
import javax.annotation.Resource;
import javax.annotation.Resources;
+import net.sf.cglib.proxy.Enhancer;
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+
import org.apache.cxf.resource.ResourceManager;
import org.apache.cxf.resource.ResourceResolver;
@@ -64,6 +72,7 @@
doInjectTest(new FieldTarget());
}
+
@Test
public void testFieldInSuperClassInjection() {
setUpResourceManager("org.apache.cxf.common.injection.FieldTarget/");
@@ -81,6 +90,18 @@
setUpResourceManager(SetterTarget.class.getCanonicalName() + "/");
doInjectTest(new SetterTarget());
}
+
+ @Test
+ public void testProxyInjection() {
+ setUpResourceManager(SetterTarget.class.getCanonicalName() + "/");
+ doInjectTest(getProxyObject(), SetterTarget.class);
+ }
+
+ @Test
+ public void testEnhancedInjection() {
+ setUpResourceManager(FieldTarget.class.getCanonicalName() + "/");
+ doInjectTest(getEnhancedObject());
+ }
@Test
public void testClassLevelInjection() {
@@ -111,15 +132,34 @@
assertTrue(target.preDestroyCalled());
}
- protected void doInjectTest(Target target) {
-
- injector.inject(target);
+ private void doInjectTest(Target target) {
+ doInjectTest(target, target.getClass());
+ }
+
+ private void doInjectTest(Target target, Class<?> clazz) {
+ injector.inject(target, clazz);
+ injector.construct(target);
assertNotNull(target.getResource1());
assertEquals(RESOURCE_ONE, target.getResource1());
assertNotNull(target.getResource2());
- assertEquals(RESOURCE_TWO, target.getResource2());
+ assertEquals(RESOURCE_TWO, target.getResource2());
+
+ }
+
+ private Target getProxyObject() {
+ Target t = (Target)Proxy.newProxyInstance(ISetterTarget.class.getClassLoader(),
+ new Class[] {ISetterTarget.class},
+ new ProxyClass(new SetterTarget()));
+ return t;
+ }
+
+ private FieldTarget getEnhancedObject() {
+ Enhancer e = new Enhancer();
+ e.setSuperclass(FieldTarget.class);
+ e.setCallback(new CallInterceptor());
+ return (FieldTarget)e.create();
}
}
@@ -130,6 +170,17 @@
String getResource2();
}
+class CallInterceptor implements MethodInterceptor {
+
+ public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
+ Object retValFromSuper = null;
+ if (!Modifier.isAbstract(method.getModifiers())) {
+ retValFromSuper = proxy.invokeSuper(obj, args);
+ }
+ return retValFromSuper;
+ }
+}
+
class FieldTarget implements Target {
@@ -160,6 +211,40 @@
}
+interface ISetterTarget extends Target {
+ void setResource1(final String argResource1);
+ void setResource2(final String argResource2);
+}
+
+class ProxyClass implements InvocationHandler {
+ Object obj;
+
+ public ProxyClass(Object o) {
+ obj = o;
+ }
+
+ public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
+ Object result = null;
+ try {
+ Class[] types = new Class[0];
+ if (args != null) {
+ types = new Class[args.length];
+ for (int i = 0; i < args.length; i++) {
+ types[i] = args[i].getClass();
+ }
+ }
+ Method target = obj.getClass().getMethod(m.getName(), types);
+ result = target.invoke(obj, args);
+ } catch (InvocationTargetException e) {
+ // Do nothing here
+ } catch (Exception eBj) {
+ eBj.printStackTrace();
+ } finally {
+ // Do something after the method is called ...
+ }
+ return result;
+ }
+}
class SetterTarget implements Target {
private String resource1;
@@ -183,7 +268,7 @@
}
@Resource(name = "resource2")
- private void setResource2(final String argResource2) {
+ public void setResource2(final String argResource2) {
this.resource2 = argResource2;
}
@@ -228,7 +313,8 @@
@Resource(name = "resource1")
class ClassTarget implements Target {
- @Resource(name = "resource2") public String resource2foo;
+ @Resource(name = "resource2")
+ public String resource2foo;
private String res1;
public final void setResource1(String res) {
Modified: incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/logging/LogUtilsTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/logging/LogUtilsTest.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/logging/LogUtilsTest.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/common/logging/LogUtilsTest.java Thu Oct 25 10:09:20 2007
@@ -55,6 +55,7 @@
LOG.addHandler(handler);
// handler called *before* localization of message
LogRecord record = new LogRecord(Level.WARNING, "FOOBAR_MSG");
+ record.setResourceBundle(LOG.getResourceBundle());
EasyMock.reportMatcher(new LogRecordMatcher(record));
handler.publish(record);
EasyMock.replay(handler);
@@ -168,7 +169,12 @@
public boolean matches(Object obj) {
if (obj instanceof LogRecord) {
LogRecord other = (LogRecord)obj;
- return record.getMessage().equals(other.getMessage())
+ String l7dString = "NOT-L7D";
+ if (record.getResourceBundle() != null) {
+ l7dString = record.getResourceBundle().getString(record.getMessage());
+ }
+ return (record.getMessage().equals(other.getMessage())
+ || l7dString.equals(other.getMessage()))
&& record.getLevel().equals(other.getLevel())
&& record.getThrown() == other.getThrown();
}
Modified: incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/configuration/spring/SpringBeanMapTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/configuration/spring/SpringBeanMapTest.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/configuration/spring/SpringBeanMapTest.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/configuration/spring/SpringBeanMapTest.java Thu Oct 25 10:09:20 2007
@@ -34,7 +34,9 @@
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("org/apache/cxf/configuration/spring/beanMap.xml");
- Map<String, Person> beans = CastUtils.cast((Map)context.getBean("mapOfPersons"));
+
+ Map<String, Person> beans = CastUtils.cast(((MapProvider)context.getBean("mapOfPersons"))
+ .createMap());
assertNotNull(beans);
assertEquals(2, beans.size());
Modified: incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/configuration/spring/SpringBeanQNameMapTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/configuration/spring/SpringBeanQNameMapTest.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/configuration/spring/SpringBeanQNameMapTest.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/configuration/spring/SpringBeanQNameMapTest.java Thu Oct 25 10:09:20 2007
@@ -38,7 +38,8 @@
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("org/apache/cxf/configuration/spring/beanQNameMap.xml");
- Map<QName, Person> beans = CastUtils.cast((Map)context.getBean("committers"));
+ Map<QName, Person> beans = CastUtils.cast(((MapProvider)context.getBean("committers"))
+ .createMap());
assertNotNull(beans);
assertEquals(2, PersonQNameImpl.getLoadCount());
Modified: incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/version/VersionTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/version/VersionTest.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/version/VersionTest.java (original)
+++ incubator/cxf/branches/jliu/common/common/src/test/java/org/apache/cxf/version/VersionTest.java Thu Oct 25 10:09:20 2007
@@ -35,6 +35,6 @@
public void testGetVersion() {
String completeVersion = Version.getCompleteVersionString();
String currentVersion = Version.getCurrentVersion();
- assertEquals(completeVersion, currentVersion);
+ assertTrue(completeVersion.contains(currentVersion));
}
}
Modified: incubator/cxf/branches/jliu/common/schemas/src/main/resources/schemas/configuration/security.xsd
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/schemas/src/main/resources/schemas/configuration/security.xsd?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/schemas/src/main/resources/schemas/configuration/security.xsd (original)
+++ incubator/cxf/branches/jliu/common/schemas/src/main/resources/schemas/configuration/security.xsd Thu Oct 25 10:09:20 2007
@@ -25,10 +25,10 @@
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:tns="http://cxf.apache.org/configuration/security"
xmlns:beans="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
jaxb:version="2.0">
<xs:import namespace="http://www.springframework.org/schema/beans"/>
@@ -116,6 +116,16 @@
</xs:complexType>
<xs:complexType name="KeyStoreType">
+ <xs:annotation>
+ <xs:documentation>
+ A KeyStoreType represents the information needed to load a collection
+ of key and certificate material from a desired location.
+ The "url", "file", and "resource" attributes are intended to be
+ mutually exclusive, though this assumption is not encoded in schema.
+ The precedence order observed by the runtime is
+ 1) "file", 2) "resource", and 3) "url".
+ </xs:documentation>
+ </xs:annotation>
<xs:attribute name="type" type="xs:string">
<xs:annotation>
<xs:documentation>
@@ -173,6 +183,49 @@
</xs:attribute>
</xs:complexType>
+ <xs:complexType name="CertStoreType">
+ <xs:annotation>
+ <xs:documentation>
+ A CertStoreType represents a catenated sequence of X.509 certificates,
+ in PEM or DER format.
+ The "url", "file", and "resource" attributes are intended to be
+ mutually exclusive, though this assumption is not encoded in schema.
+ The precedence order observed by the runtime is
+ 1) "file", 2) "resource", and 3) "url".
+ </xs:documentation>
+ </xs:annotation>
+ <xs:attribute name="file" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ This attribute specifies the File location of the certificate store.
+ This element should be a properly accessible file from the
+ working directory. Only one attribute of
+ "url", "file", or "resource" is allowed.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="resource" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ This attribute specifies the Resource location of the certificate store.
+ This element should be a properly accessible on the classpath.
+ Only one attribute of
+ "url", "file", or "resource" is allowed.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="url" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ This attribute specifies the URL location of the certificate store.
+ This element should be a properly accessible URL, such as
+ "http://..." "file:///...", etc. Only one attribute of
+ "url", "file", or "resource" is allowed.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:complexType>
+
<xs:complexType name="KeyManagersType">
<xs:annotation>
<xs:documentation>
@@ -183,37 +236,37 @@
<xs:sequence>
<xs:element name="keyStore" type="tns:KeyStoreType" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element specified the Keystore for these JSSE KeyManagers.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element specified the Keystore for these JSSE KeyManagers.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
</xs:sequence>
<xs:attribute name="keyPassword" type="xs:string">
- <xs:annotation>
- <xs:documentation>
- This attribute contains the password that unlocks the keys
- within the keystore.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:annotation>
+ <xs:documentation>
+ This attribute contains the password that unlocks the keys
+ within the keystore.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
<xs:attribute name="provider" type="xs:string">
- <xs:annotation>
- <xs:documentation>
- This attribute contains the KeyManagers provider name.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:annotation>
+ <xs:documentation>
+ This attribute contains the KeyManagers provider name.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
<xs:attribute name="factoryAlgorithm" type="xs:string">
- <xs:annotation>
- <xs:documentation>
- This attribute contains the algorithm the KeyManagers Factory
- will use in creating the KeyManagers from the KeyStore. Most
- common examples are "PKIX".
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:annotation>
+ <xs:documentation>
+ This attribute contains the algorithm the KeyManagers Factory
+ will use in creating the KeyManagers from the KeyStore. Most
+ common examples are "PKIX".
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:complexType>
<xs:complexType name="TrustManagersType">
@@ -223,31 +276,40 @@
a single Keystore used for trusted certificates.
</xs:documentation>
</xs:annotation>
- <xs:sequence>
- <xs:element name="keyStore" type="tns:KeyStoreType" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains the KeyStore used as a trust store.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
- </xs:sequence>
- <xs:attribute name="provider" type="xs:string">
- <xs:annotation>
- <xs:documentation>
- This attribute contains the KeyManagers provider name.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:choice>
+ <xs:element name="keyStore" type="tns:KeyStoreType"
+ minOccurs="0">
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the KeyStore used as a trust
+ store.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:element name="certStore" type="tns:CertStoreType" minOccurs="0">
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the CertStore used as a trust store.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:choice>
+ <xs:attribute name="provider" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ This attribute contains the KeyManagers provider name.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
<xs:attribute name="factoryAlgorithm" type="xs:string">
- <xs:annotation>
- <xs:documentation>
- This attribute contains the algorithm the KeyManagers Factory
- will use in creating the KeyManagers from the KeyStore. Most
- common examples are "PKIX".
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:annotation>
+ <xs:documentation>
+ This attribute contains the algorithm the KeyManagers Factory
+ will use in creating the KeyManagers from the KeyStore. Most
+ common examples are "PKIX".
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:complexType>
<xs:complexType name="CipherSuites">
@@ -281,122 +343,122 @@
<xs:complexType name="TLSClientParametersType">
<xs:all>
<xs:element name="keyManagers" type="tns:KeyManagersType" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains the KeyManagers specification.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the KeyManagers specification.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element name="trustManagers" type="tns:TrustManagersType" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains the TrustManagers specification.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the TrustManagers specification.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element name="cipherSuites" type="tns:CipherSuites" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains the the CipherSuites that will be supported.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the the CipherSuites that will be supported.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element name="cipherSuitesFilter" type="tns:FiltersType" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains the filters of the supported CipherSuites
- that will be supported and used if available.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the filters of the supported CipherSuites
+ that will be supported and used if available.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element name="secureRandomParameters"
type="tns:SecureRandomParameters" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains SecureRandom specification.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains SecureRandom specification.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
</xs:all>
<xs:attribute name="jsseProvider" type="xs:string">
- <xs:annotation>
- <xs:documentation>
- This attribute contains the JSSE provider name.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:annotation>
+ <xs:documentation>
+ This attribute contains the JSSE provider name.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
<xs:attribute name="secureSocketProtocol" type="xs:string">
- <xs:annotation>
- <xs:documentation>
- This attribute contains the Protocol Name. Most common
- example is "SSL", "TLS" or "TLSv1".
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:annotation>
+ <xs:documentation>
+ This attribute contains the Protocol Name. Most common
+ example is "SSL", "TLS" or "TLSv1".
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:complexType>
<xs:complexType name="TLSServerParametersType">
<xs:all>
<xs:element name="keyManagers" type="tns:KeyManagersType" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains the KeyManagers specification.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the KeyManagers specification.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element name="trustManagers" type="tns:TrustManagersType" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains the TrustManagers specification.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the TrustManagers specification.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element name="cipherSuites" type="tns:CipherSuites" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains the the CipherSuites that will be supported.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the the CipherSuites that will be supported.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element name="cipherSuitesFilter" type="tns:FiltersType" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains the filters of the supported CipherSuites
- that will be supported and used if available.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains the filters of the supported CipherSuites
+ that will be supported and used if available.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element name="secureRandomParameters"
type="tns:SecureRandomParameters" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains SecureRandom specification.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains SecureRandom specification.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element name="clientAuthentication"
type="tns:ClientAuthentication" minOccurs="0">
- <xs:annotation>
- <xs:documentation>
- This element contains Client Authentication specification.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
+ <xs:annotation>
+ <xs:documentation>
+ This element contains Client Authentication specification.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
</xs:all>
<xs:attribute name="jsseProvider" type="xs:string">
- <xs:annotation>
- <xs:documentation>
- This attribute contains the JSSE provider name.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:annotation>
+ <xs:documentation>
+ This attribute contains the JSSE provider name.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
<xs:attribute name="secureSocketProtocol" type="xs:string">
- <xs:annotation>
- <xs:documentation>
- This attribute contains the Protocol Name. Most common
- example is "SSL", "TLS" or "TLSv1".
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:annotation>
+ <xs:documentation>
+ This attribute contains the Protocol Name. Most common
+ example is "SSL", "TLS" or "TLSv1".
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:complexType>
</xs:schema>
Modified: incubator/cxf/branches/jliu/common/xsd/src/main/java/org/apache/cxf/maven_plugin/CodegenUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/common/xsd/src/main/java/org/apache/cxf/maven_plugin/CodegenUtils.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/common/xsd/src/main/java/org/apache/cxf/maven_plugin/CodegenUtils.java (original)
+++ incubator/cxf/branches/jliu/common/xsd/src/main/java/org/apache/cxf/maven_plugin/CodegenUtils.java Thu Oct 25 10:09:20 2007
@@ -19,9 +19,11 @@
package org.apache.cxf.maven_plugin;
+import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
+import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.JarEntry;
@@ -60,20 +62,27 @@
return;
}
}
- JarFile jar;
+
try {
- jar = new JarFile(url.getPath());
- Enumeration entries = jar.entries();
- while (entries.hasMoreElements()) {
- JarEntry entry = (JarEntry)entries.nextElement();
- if (!entry.isDirectory()
- && !entry.getName().startsWith("META")
- && entry.getTime() > timestamp) {
-
- timestamp = entry.getTime();
- }
+ if (url.getPath().endsWith(".class")) {
+ timestamp = new File(url.toURI()).lastModified();
+ } else {
+ JarFile jar = new JarFile(url.getPath());
+ Enumeration entries = jar.entries();
+ while (entries.hasMoreElements()) {
+ JarEntry entry = (JarEntry)entries.nextElement();
+ if (!entry.isDirectory()
+ && !entry.getName().startsWith("META")
+ && entry.getTime() > timestamp) {
+
+ timestamp = entry.getTime();
+ }
+ }
}
} catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Modified: incubator/cxf/branches/jliu/distribution/bundle/pom.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/distribution/bundle/pom.xml?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/distribution/bundle/pom.xml (original)
+++ incubator/cxf/branches/jliu/distribution/bundle/pom.xml Thu Oct 25 10:09:20 2007
@@ -87,12 +87,14 @@
<version>${pom.version}</version>
<optional>true</optional>
</dependency>
+
<dependency>
<groupId>${pom.groupId}</groupId>
- <artifactId>cxf-tools-java2wsdl</artifactId>
+ <artifactId>cxf-tools-java2ws</artifactId>
<version>${pom.version}</version>
<optional>true</optional>
- </dependency>
+ </dependency>
+
<dependency>
<groupId>${pom.groupId}</groupId>
<artifactId>cxf-xjc-ts</artifactId>
Modified: incubator/cxf/branches/jliu/distribution/manifest/pom.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/distribution/manifest/pom.xml?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/distribution/manifest/pom.xml (original)
+++ incubator/cxf/branches/jliu/distribution/manifest/pom.xml Thu Oct 25 10:09:20 2007
@@ -74,16 +74,19 @@
<artifactId>cxf-tools-wsdlto-databinding-jaxb</artifactId>
<version>${pom.version}</version>
</dependency>
+
<dependency>
<groupId>${pom.groupId}</groupId>
<artifactId>cxf-tools-wsdlto-frontend-jaxws</artifactId>
<version>${pom.version}</version>
</dependency>
+
<dependency>
<groupId>${pom.groupId}</groupId>
- <artifactId>cxf-tools-java2wsdl</artifactId>
+ <artifactId>cxf-tools-java2ws</artifactId>
<version>${pom.version}</version>
- </dependency>
+ </dependency>
+
<dependency>
<groupId>${pom.groupId}</groupId>
<artifactId>cxf-xjc-dv</artifactId>
@@ -211,7 +214,7 @@
<groupId>${pom.groupId}</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>${pom.version}</version>
- </dependency>
+ </dependency>
<dependency>
<groupId>${pom.groupId}</groupId>
<artifactId>cxf-bundle</artifactId>
@@ -223,15 +226,9 @@
<version>1.0-RC2</version>
</dependency>
<dependency>
- <groupId>commons-httpclient</groupId>
- <artifactId>commons-httpclient</artifactId>
- <version>3.1-rc1</version>
- </dependency>
- <dependency>
- <groupId>javax.ws.rs</groupId>
- <artifactId>jsr311-api</artifactId>
- <version>0.3</version>
- </dependency>
+ <groupId>asm</groupId>
+ <artifactId>asm</artifactId>
+ </dependency>
</dependencies>
<build>
Modified: incubator/cxf/branches/jliu/distribution/pom.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/distribution/pom.xml?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/distribution/pom.xml (original)
+++ incubator/cxf/branches/jliu/distribution/pom.xml Thu Oct 25 10:09:20 2007
@@ -83,11 +83,13 @@
<artifactId>cxf-tools-wsdlto-frontend-jaxws</artifactId>
<version>${pom.version}</version>
</dependency>
+
<dependency>
<groupId>${pom.groupId}</groupId>
- <artifactId>cxf-tools-java2wsdl</artifactId>
+ <artifactId>cxf-tools-java2ws</artifactId>
<version>${pom.version}</version>
- </dependency>
+ </dependency>
+
<dependency>
<groupId>${pom.groupId}</groupId>
<artifactId>cxf-xjc-dv</artifactId>
@@ -191,11 +193,18 @@
<artifactId>cxf-rt-ws-policy</artifactId>
<version>${pom.version}</version>
</dependency>
- <dependency>
+ <dependency>
<groupId>${pom.groupId}</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>${pom.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>bouncycastle</groupId>
+ <artifactId>bcprov-jdk14</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
+
<dependency>
<groupId>${pom.groupId}</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
@@ -220,6 +229,10 @@
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.0-RC2</version>
+ </dependency>
+ <dependency>
+ <groupId>asm</groupId>
+ <artifactId>asm</artifactId>
</dependency>
<dependency>
<groupId>${pom.groupId}</groupId>
Modified: incubator/cxf/branches/jliu/distribution/src/main/appended-resources/META-INF/NOTICE
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/distribution/src/main/appended-resources/META-INF/NOTICE?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/distribution/src/main/appended-resources/META-INF/NOTICE (original)
+++ incubator/cxf/branches/jliu/distribution/src/main/appended-resources/META-INF/NOTICE Thu Oct 25 10:09:20 2007
@@ -23,5 +23,21 @@
This Product also includes software developed by David Heinemeier Hansson.
(http://dev.rubyonrails.org/browser/trunk/activesupport/lib/active_support/inflections.rb)
+
+Portions of the included XmlSchema library are Copyright 2006 International Business Machines Corp.
+
+
+Portions of the included xml-apis library were originally based on the following:
+ - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+ - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
+ - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org
+
+
+Portions of the included xbean library were originally based on the following:
+ - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.
+
+
Additional copyright notices and license terms applicable are
present in the licenses directory of this distribution.
+
+
Modified: incubator/cxf/branches/jliu/distribution/src/main/release/README
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/distribution/src/main/release/README?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/distribution/src/main/release/README (original)
+++ incubator/cxf/branches/jliu/distribution/src/main/release/README Thu Oct 25 10:09:20 2007
@@ -39,6 +39,35 @@
endorsed by the ASF.
+Export Notice
+============================
+This distribution includes cryptographic software. The country in
+which you currently reside may have restrictions on the import,
+possession, use, and/or re-export to another country, of
+encryption software. BEFORE using any encryption software, please
+check your country's laws, regulations and policies concerning the
+import, possession, or use, and re-export of encryption software, to
+see if this is permitted. See <http://www.wassenaar.org/> for more
+information.
+
+The U.S. Government Department of Commerce, Bureau of Industry and
+Security (BIS), has classified this software as Export Commodity
+Control Number (ECCN) 5D002.C.1, which includes information security
+software using or performing cryptographic functions with asymmetric
+algorithms. The form and manner of this Apache Software Foundation
+distribution makes it eligible for export under the License Exception
+ENC Technology Software Unrestricted (TSU) exception (see the BIS
+Export Administration Regulations, Section 740.13) for both object
+code and source code.
+
+The following provides more details on the included cryptographic
+software:
+ http://xml.apache.org/security/
+ http://www.bouncycastle.org/
+ http://ws.apache.org/wss4j/
+
+
+
Getting Started
===============