Author: gnodet
Date: Mon Jun 9 01:48:42 2008
New Revision: 664660
URL: http://svn.apache.org/viewvc?rev=664660&view=rev
Log:
Fix jaxb specs and jaxws FactoryFinder
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBContext.java
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Unmarshaller.java
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Validator.java
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElement.java
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnum.java
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBContext.java
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Unmarshaller.java
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Validator.java
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElement.java
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnum.java
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlTransient.java
servicemix/smx4/specs/trunk/jaxws-api-2.0/src/main/java/javax/xml/ws/spi/FactoryFinder.java
servicemix/smx4/specs/trunk/jaxws-api-2.1/src/main/java/javax/xml/ws/spi/FactoryFinder.java
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBContext.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBContext.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBContext.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBContext.java
Mon Jun 9 01:48:42 2008
@@ -46,7 +46,6 @@
public abstract Unmarshaller createUnmarshaller() throws JAXBException;
- @Deprecated
public abstract Validator createValidator() throws JAXBException;
public void generateSchema(SchemaOutputResolver resolver) throws
IOException {
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Unmarshaller.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Unmarshaller.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Unmarshaller.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Unmarshaller.java
Mon Jun 9 01:48:42 2008
@@ -55,7 +55,6 @@
UnmarshallerHandler getUnmarshallerHandler();
- @Deprecated
boolean isValidating() throws JAXBException;
<A extends XmlAdapter> void setAdapter(Class<A> type, A adapter);
@@ -72,7 +71,6 @@
void setSchema(Schema schema);
- @Deprecated
void setValidating(boolean validating) throws JAXBException;
Object unmarshal(File f) throws JAXBException;
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Validator.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Validator.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Validator.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Validator.java
Mon Jun 9 01:48:42 2008
@@ -16,24 +16,18 @@
*/
package javax.xml.bind;
[EMAIL PROTECTED]
public interface Validator {
- @Deprecated
ValidationEventHandler getEventHandler() throws JAXBException;
- @Deprecated
Object getProperty(String name) throws PropertyException;
- @Deprecated
void setEventHandler(ValidationEventHandler handler) throws JAXBException;
- @Deprecated
void setProperty(String name, Object value) throws PropertyException;
- @Deprecated
boolean validate(Object subRoot) throws JAXBException;
- @Deprecated
boolean validateRoot(Object rootObj) throws JAXBException;
+
}
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
Mon Jun 9 01:48:42 2008
@@ -16,11 +16,13 @@
*/
package javax.xml.bind.annotation;
+import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
[EMAIL PROTECTED]
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.PACKAGE, ElementType.TYPE })
public @interface XmlAccessorType {
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElement.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElement.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElement.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElement.java
Mon Jun 9 01:48:42 2008
@@ -22,7 +22,7 @@
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
[EMAIL PROTECTED](value = {ElementType.TYPE, ElementType.METHOD })
[EMAIL PROTECTED](value = {ElementType.FIELD, ElementType.METHOD })
public @interface XmlElement {
final class DEFAULT {
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
Mon Jun 9 01:48:42 2008
@@ -32,8 +32,6 @@
Class scope() default GLOBAL.class;
- String defautValue() default "##default";
-
String namespace() default "##default";
String substitutionHeadNamespace() default "##default";
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnum.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnum.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnum.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnum.java
Mon Jun 9 01:48:42 2008
@@ -25,5 +25,5 @@
@Target(ElementType.TYPE)
public @interface XmlEnum {
- Class value() default String.class;
+ Class<?> value() default String.class;
}
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBContext.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBContext.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBContext.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBContext.java
Mon Jun 9 01:48:42 2008
@@ -46,7 +46,6 @@
public abstract Unmarshaller createUnmarshaller() throws JAXBException;
- @Deprecated
public abstract Validator createValidator() throws JAXBException;
public void generateSchema(SchemaOutputResolver resolver) throws
IOException {
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Unmarshaller.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Unmarshaller.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Unmarshaller.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Unmarshaller.java
Mon Jun 9 01:48:42 2008
@@ -55,7 +55,6 @@
UnmarshallerHandler getUnmarshallerHandler();
- @Deprecated
boolean isValidating() throws JAXBException;
<A extends XmlAdapter> void setAdapter(Class<A> type, A adapter);
@@ -72,7 +71,6 @@
void setSchema(Schema schema);
- @Deprecated
void setValidating(boolean validating) throws JAXBException;
Object unmarshal(File f) throws JAXBException;
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Validator.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Validator.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Validator.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Validator.java
Mon Jun 9 01:48:42 2008
@@ -16,24 +16,18 @@
*/
package javax.xml.bind;
[EMAIL PROTECTED]
public interface Validator {
- @Deprecated
ValidationEventHandler getEventHandler() throws JAXBException;
- @Deprecated
Object getProperty(String name) throws PropertyException;
- @Deprecated
void setEventHandler(ValidationEventHandler handler) throws JAXBException;
- @Deprecated
void setProperty(String name, Object value) throws PropertyException;
- @Deprecated
boolean validate(Object subRoot) throws JAXBException;
- @Deprecated
boolean validateRoot(Object rootObj) throws JAXBException;
+
}
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
Mon Jun 9 01:48:42 2008
@@ -16,11 +16,13 @@
*/
package javax.xml.bind.annotation;
+import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
[EMAIL PROTECTED]
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.PACKAGE, ElementType.TYPE })
public @interface XmlAccessorType {
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElement.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElement.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElement.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElement.java
Mon Jun 9 01:48:42 2008
@@ -22,7 +22,7 @@
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
[EMAIL PROTECTED](value = {ElementType.TYPE, ElementType.METHOD })
[EMAIL PROTECTED](value = {ElementType.FIELD, ElementType.METHOD })
public @interface XmlElement {
final class DEFAULT {
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
Mon Jun 9 01:48:42 2008
@@ -32,8 +32,6 @@
Class scope() default GLOBAL.class;
- String defautValue() default "##default";
-
String namespace() default "##default";
String substitutionHeadNamespace() default "##default";
@@ -41,4 +39,5 @@
String substitutionHeadName() default "";
String defaultValue() default "\u0000";
+
}
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java
Mon Jun 9 01:48:42 2008
@@ -30,4 +30,7 @@
String namespace() default "##default";
boolean nillable() default false;
+
+ boolean required() default false;
+
}
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnum.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnum.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnum.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnum.java
Mon Jun 9 01:48:42 2008
@@ -25,5 +25,5 @@
@Target(ElementType.TYPE)
public @interface XmlEnum {
- Class value() default String.class;
+ Class<?> value() default String.class;
}
Modified:
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlTransient.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlTransient.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlTransient.java
(original)
+++
servicemix/smx4/specs/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlTransient.java
Mon Jun 9 01:48:42 2008
@@ -22,6 +22,6 @@
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
[EMAIL PROTECTED](value = {ElementType.FIELD, ElementType.METHOD})
[EMAIL PROTECTED](value = {ElementType.FIELD, ElementType.METHOD,
ElementType.TYPE})
public @interface XmlTransient {
}
Modified:
servicemix/smx4/specs/trunk/jaxws-api-2.0/src/main/java/javax/xml/ws/spi/FactoryFinder.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxws-api-2.0/src/main/java/javax/xml/ws/spi/FactoryFinder.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxws-api-2.0/src/main/java/javax/xml/ws/spi/FactoryFinder.java
(original)
+++
servicemix/smx4/specs/trunk/jaxws-api-2.0/src/main/java/javax/xml/ws/spi/FactoryFinder.java
Mon Jun 9 01:48:42 2008
@@ -1,112 +1,301 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * 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 javax.xml.ws.spi;
-import java.io.InputStream;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
-
-import java.util.Properties;
-import java.io.BufferedReader;
+import java.io.InputStream;
import java.io.InputStreamReader;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.PrivilegedAction;
+import java.util.Properties;
-import javax.xml.ws.WebServiceException;
-
+/**
+ * This code is designed to implement the pluggability
+ * feature and is designed to both compile and run on JDK version 1.1 and
+ * later. The code also runs both as part of an unbundled jar file and
+ * when bundled as part of the JDK.
+ * <p/>
+ * This class is duplicated for each subpackage so keep it in sync.
+ * It is package private and therefore is not exposed as part of the JAXRPC
+ * API.
+ */
class FactoryFinder {
- static Object locate(String factoryId) {
- return locate(factoryId, null);
- }
-
- static Object locate(String factoryId, String altClassName) {
- return locate(factoryId, altClassName,
Thread.currentThread().getContextClassLoader());
- }
-
- static Object locate(String factoryId, String altClassName, ClassLoader
classLoader) {
- try {
- // If we are deployed into an OSGi environment, leverage it
- Class spiClass =
org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryId);
- if (spiClass != null) {
- return spiClass.newInstance();
- }
- } catch (Throwable e) {
+ /**
+ * Set to true for debugging.
+ */
+ private static final boolean debug = false;
+
+ private static void debugPrintln(String msg) {
+ if (debug) {
+ System.err.println("Factory Finder:" + msg);
}
+ }
- String serviceId = "META-INF/services/" + factoryId;
- try {
- InputStream is = null;
-
- if (classLoader == null) {
- is =
ClassLoader.getSystemResourceAsStream(serviceId);
- } else {
- is = classLoader.getResourceAsStream(serviceId);
- }
-
- if (is != null) {
- BufferedReader br = new BufferedReader(new
InputStreamReader(is, "UTF-8"));
- String factoryClassName = br.readLine();
- br.close();
-
- if (factoryClassName != null &&
!"".equals(factoryClassName)) {
- return loadFactory(factoryClassName,
classLoader);
- }
- }
- } catch (Exception ex) {
- }
-
- try {
- String configFile = System.getProperty("java.home")
- + File.separator + "lib" + File.separator
- + "jaxws.properties";
- File f = new File(configFile);
- if (f.exists()) {
- Properties props = new Properties();
- props.load(new FileInputStream(f));
- String factoryClassName = props.getProperty(factoryId);
- return loadFactory(factoryClassName, classLoader);
+ /**
+ * Figure out which ClassLoader to use. For JDK 1.2 and later use
+ * the context ClassLoader.
+ *
+ * @return the <code>ClassLoader</code>
+ * @throws ConfigurationError if this class is unable to work with the
+ * host JDK
+ */
+ private static ClassLoader findClassLoader()
+ throws ConfigurationError {
+ // REVIEW This doPriv block may be unnecessary because this method is
private and
+ // the caller already has a doPriv. I added the doPriv in case
someone changes the
+ // visibility of this method to non-private.
+ ClassLoader cl = (ClassLoader)
+ doPrivileged( new PrivilegedAction() {
+ public Object run() {
+
+ Method m = null;
+
+ try {
+
+ m = Thread.class.getMethod("getContextClassLoader",
(Class []) null);
+ } catch (NoSuchMethodException e) {
+ // Assume that we are running JDK 1.1, use the current
ClassLoader
+ debugPrintln("assuming JDK 1.1");
+ return FactoryFinder.class.getClassLoader();
+ }
+
+ try {
+ return (ClassLoader) m.invoke(Thread.currentThread(),
(Object []) null);
+ } catch (IllegalAccessException e) {
+ // assert(false)
+ throw new ConfigurationError("Unexpected
IllegalAccessException",
+ e);
+ } catch (InvocationTargetException e) {
+ // assert(e.getTargetException() instanceof
SecurityException)
+ throw new ConfigurationError("Unexpected
InvocationTargetException",
+ e);
+ }
+ }
}
- } catch (Exception e) {
+ );
+ return cl;
+
+ }
+
+ /**
+ * Create an instance of a class using the specified
+ * <code>ClassLoader</code>, or if that fails from the
+ * <code>ClassLoader</code> that loaded this class.
+ *
+ * @param className the name of the class to instantiate
+ * @param classLoader a <code>ClassLoader</code> to load the class from
+ * @return a new <code>Object</code> that is an instance of the class of
+ * the given name from the given class loader
+ * @throws ConfigurationError if the class could not be found or
+ * instantiated
+ */
+ private static Object newInstance(String className,
+ ClassLoader classLoader)
+ throws ConfigurationError {
+
+ final ClassLoader iClassLoader = classLoader;
+ final String iClassName = className;
+
+ // REVIEW This doPriv block may be unnecessary because this method is
private and
+ // the caller already has a doPriv. I added the doPriv in case
someone changes the
+ // visibility of this method to non-private.
+ Object obj =
+ doPrivileged( new PrivilegedAction() {
+ public Object run() {
+ try {
+ if (iClassLoader != null) {
+ try {
+ return
iClassLoader.loadClass(iClassName).newInstance();
+ } catch (ClassNotFoundException x) {
+ // try again
+ }
+ }
+ return Class.forName(iClassName).newInstance();
+ } catch (ClassNotFoundException x) {
+ throw new ConfigurationError(
+ "Provider " + iClassName + " not found", x);
+ } catch (Exception x) {
+ throw new ConfigurationError(
+ "Provider " + iClassName + " could not be
instantiated: " + x,
+ x);
+ }
+ }
+ });
+ return obj;
+ }
+
+ /**
+ * Finds the implementation Class object in the specified order. Main
+ * entry point.
+ *
+ * @param factoryId Name of the factory to find, same as
+ * a property name
+ * @param fallbackClassName Implementation class name, if nothing else
+ * is found. Use null to mean no fallback.
+ * @return Class object of factory, never null
+ * @throws FactoryFinder.ConfigurationError
+ * Package private so this code can be shared.
+ */
+ static Object find(String factoryId, String fallbackClassName)
+ throws ConfigurationError {
+
+ final String iFactoryId = factoryId;
+ final String iFallbackClassName = fallbackClassName;
+
+ Object obj =
+ doPrivileged( new PrivilegedAction() {
+ public Object run() {
+ debugPrintln("debug is on");
+
+ ClassLoader classLoader = findClassLoader();
+
+ try {
+ // If we are deployed into an OSGi
environment, leverage it
+ Class spiClass =
org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryId);
+ if (spiClass != null) {
+ return spiClass.newInstance();
+ }
+ } catch (Throwable e) {
+ }
+
+ // Use the system property first
+ try {
+ String systemProp =
+ System.getProperty(iFactoryId);
+ if (systemProp != null) {
+ debugPrintln("found system property " +
systemProp);
+ return newInstance(systemProp, classLoader);
+ }
+ } catch (SecurityException se) {
+ }
+
+ // try to read from $java.home/lib/xml.properties
+ try {
+ String javah = System.getProperty("java.home");
+ String configFile = javah + File.separator +
+ "lib" + File.separator + "jaxrpc.properties";
+ File f = new File(configFile);
+ if (f.exists()) {
+ Properties props = new Properties();
+ props.load(new FileInputStream(f));
+ String factoryClassName =
props.getProperty(iFactoryId);
+ debugPrintln("found java.home property " +
factoryClassName);
+ return newInstance(factoryClassName, classLoader);
+ }
+ } catch (Exception ex) {
+ if (debug) ex.printStackTrace();
+ }
+
+ String serviceId = "META-INF/services/" + iFactoryId;
+ // try to find services in CLASSPATH
+ try {
+ InputStream is = null;
+ if (classLoader == null) {
+ is =
ClassLoader.getSystemResourceAsStream(serviceId);
+ } else {
+ is = classLoader.getResourceAsStream(serviceId);
+ }
+
+ if (is != null) {
+ debugPrintln("found " + serviceId);
+
+ // Read the service provider name in UTF-8 as
specified in
+ // the jar spec. Unfortunately this fails in
Microsoft
+ // VJ++, which does not implement the UTF-8
+ // encoding. Theoretically, we should simply let
it fail in
+ // that case, since the JVM is obviously broken if
it
+ // doesn't support such a basic standard. But
since there
+ // are still some users attempting to use VJ++ for
+ // development, we have dropped in a fallback
which makes a
+ // second attempt using the platform's default
encoding. In
+ // VJ++ this is apparently ASCII, which is a
subset of
+ // UTF-8... and since the strings we'll be reading
here are
+ // also primarily limited to the 7-bit ASCII range
(at
+ // least, in English versions), this should work
well
+ // enough to keep us on the air until we're ready
to
+ // officially decommit from VJ++. [Edited comment
from
+ // jkesselm]
+ BufferedReader rd;
+ try {
+ rd = new BufferedReader(new
InputStreamReader(is, "UTF-8"));
+ } catch (java.io.UnsupportedEncodingException e) {
+ rd = new BufferedReader(new
InputStreamReader(is));
+ }
+
+ String factoryClassName = rd.readLine();
+ rd.close();
+
+ if (factoryClassName != null &&
+ ! "".equals(factoryClassName)) {
+ debugPrintln("loaded from services: " +
factoryClassName);
+ return newInstance(factoryClassName,
classLoader);
+ }
+ }
+ } catch (Exception ex) {
+ if (debug) ex.printStackTrace();
+ }
+
+ if (iFallbackClassName == null) {
+ throw new ConfigurationError(
+ "Provider for " + iFactoryId + " cannot be
found", null);
+ }
+
+ debugPrintln("loaded from fallback value: " +
iFallbackClassName);
+ return newInstance(iFallbackClassName, classLoader);
+ }
+ });
+ return obj;
+ }
+
+ private static Object doPrivileged(PrivilegedAction action) {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm == null) {
+ return(action.run());
+ } else {
+ return java.security.AccessController.doPrivileged(action);
+ }
+ }
+
+ static class ConfigurationError extends Error {
+ // fixme: should this be refactored to use the jdk1.4 exception
+ // wrapping?
+
+ private Exception exception;
+
+ /**
+ * Construct a new instance with the specified detail string and
+ * exception.
+ *
+ * @param msg the Message for this error
+ * @param x an Exception that caused this failure, or null
+ */
+ ConfigurationError(String msg, Exception x) {
+ super(msg);
+ this.exception = x;
}
- try {
- String prop = System.getProperty(factoryId);
- if (prop != null) {
- return loadFactory(prop, classLoader);
- }
- } catch (Exception e) {
- }
-
- if (altClassName == null) {
- throw new WebServiceException("Unable to locate factory
for " + factoryId + ".", null);
- }
- return loadFactory(altClassName, classLoader);
- }
-
- private static Object loadFactory(String className, ClassLoader
classLoader) {
- try {
- Class factoryClass = classLoader == null ?
Class.forName(className)
- :
classLoader.loadClass(className);
- return factoryClass.newInstance();
- } catch (ClassNotFoundException x) {
- throw new WebServiceException("Requested factory "
- + className + " cannot be located.
Classloader ="
- + classLoader.toString(), x);
- } catch (Exception x) {
- throw new WebServiceException("Requested factory "
- + className + " could not be
instantiated: " + x, x);
- }
- }
+ Exception getException() {
+ return exception;
+ }
+ }
}
Modified:
servicemix/smx4/specs/trunk/jaxws-api-2.1/src/main/java/javax/xml/ws/spi/FactoryFinder.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxws-api-2.1/src/main/java/javax/xml/ws/spi/FactoryFinder.java?rev=664660&r1=664659&r2=664660&view=diff
==============================================================================
---
servicemix/smx4/specs/trunk/jaxws-api-2.1/src/main/java/javax/xml/ws/spi/FactoryFinder.java
(original)
+++
servicemix/smx4/specs/trunk/jaxws-api-2.1/src/main/java/javax/xml/ws/spi/FactoryFinder.java
Mon Jun 9 01:48:42 2008
@@ -1,112 +1,301 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * 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 javax.xml.ws.spi;
-import java.io.InputStream;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
-
-import java.util.Properties;
-import java.io.BufferedReader;
+import java.io.InputStream;
import java.io.InputStreamReader;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.PrivilegedAction;
+import java.util.Properties;
-import javax.xml.ws.WebServiceException;
-
+/**
+ * This code is designed to implement the pluggability
+ * feature and is designed to both compile and run on JDK version 1.1 and
+ * later. The code also runs both as part of an unbundled jar file and
+ * when bundled as part of the JDK.
+ * <p/>
+ * This class is duplicated for each subpackage so keep it in sync.
+ * It is package private and therefore is not exposed as part of the JAXRPC
+ * API.
+ */
class FactoryFinder {
- static Object locate(String factoryId) {
- return locate(factoryId, null);
- }
-
- static Object locate(String factoryId, String altClassName) {
- return locate(factoryId, altClassName,
Thread.currentThread().getContextClassLoader());
- }
-
- static Object locate(String factoryId, String altClassName, ClassLoader
classLoader) {
- try {
- // If we are deployed into an OSGi environment, leverage it
- Class spiClass =
org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryId);
- if (spiClass != null) {
- return spiClass.newInstance();
- }
- } catch (Throwable e) {
+ /**
+ * Set to true for debugging.
+ */
+ private static final boolean debug = false;
+
+ private static void debugPrintln(String msg) {
+ if (debug) {
+ System.err.println("Factory Finder:" + msg);
}
+ }
- String serviceId = "META-INF/services/" + factoryId;
- try {
- InputStream is = null;
-
- if (classLoader == null) {
- is =
ClassLoader.getSystemResourceAsStream(serviceId);
- } else {
- is = classLoader.getResourceAsStream(serviceId);
- }
-
- if (is != null) {
- BufferedReader br = new BufferedReader(new
InputStreamReader(is, "UTF-8"));
- String factoryClassName = br.readLine();
- br.close();
-
- if (factoryClassName != null &&
!"".equals(factoryClassName)) {
- return loadFactory(factoryClassName,
classLoader);
- }
- }
- } catch (Exception ex) {
- }
-
- try {
- String configFile = System.getProperty("java.home")
- + File.separator + "lib" + File.separator
- + "jaxws.properties";
- File f = new File(configFile);
- if (f.exists()) {
- Properties props = new Properties();
- props.load(new FileInputStream(f));
- String factoryClassName = props.getProperty(factoryId);
- return loadFactory(factoryClassName, classLoader);
+ /**
+ * Figure out which ClassLoader to use. For JDK 1.2 and later use
+ * the context ClassLoader.
+ *
+ * @return the <code>ClassLoader</code>
+ * @throws ConfigurationError if this class is unable to work with the
+ * host JDK
+ */
+ private static ClassLoader findClassLoader()
+ throws ConfigurationError {
+ // REVIEW This doPriv block may be unnecessary because this method is
private and
+ // the caller already has a doPriv. I added the doPriv in case
someone changes the
+ // visibility of this method to non-private.
+ ClassLoader cl = (ClassLoader)
+ doPrivileged( new PrivilegedAction() {
+ public Object run() {
+
+ Method m = null;
+
+ try {
+
+ m = Thread.class.getMethod("getContextClassLoader",
(Class []) null);
+ } catch (NoSuchMethodException e) {
+ // Assume that we are running JDK 1.1, use the current
ClassLoader
+ debugPrintln("assuming JDK 1.1");
+ return FactoryFinder.class.getClassLoader();
+ }
+
+ try {
+ return (ClassLoader) m.invoke(Thread.currentThread(),
(Object []) null);
+ } catch (IllegalAccessException e) {
+ // assert(false)
+ throw new ConfigurationError("Unexpected
IllegalAccessException",
+ e);
+ } catch (InvocationTargetException e) {
+ // assert(e.getTargetException() instanceof
SecurityException)
+ throw new ConfigurationError("Unexpected
InvocationTargetException",
+ e);
+ }
+ }
}
- } catch (Exception e) {
+ );
+ return cl;
+
+ }
+
+ /**
+ * Create an instance of a class using the specified
+ * <code>ClassLoader</code>, or if that fails from the
+ * <code>ClassLoader</code> that loaded this class.
+ *
+ * @param className the name of the class to instantiate
+ * @param classLoader a <code>ClassLoader</code> to load the class from
+ * @return a new <code>Object</code> that is an instance of the class of
+ * the given name from the given class loader
+ * @throws ConfigurationError if the class could not be found or
+ * instantiated
+ */
+ private static Object newInstance(String className,
+ ClassLoader classLoader)
+ throws ConfigurationError {
+
+ final ClassLoader iClassLoader = classLoader;
+ final String iClassName = className;
+
+ // REVIEW This doPriv block may be unnecessary because this method is
private and
+ // the caller already has a doPriv. I added the doPriv in case
someone changes the
+ // visibility of this method to non-private.
+ Object obj =
+ doPrivileged( new PrivilegedAction() {
+ public Object run() {
+ try {
+ if (iClassLoader != null) {
+ try {
+ return
iClassLoader.loadClass(iClassName).newInstance();
+ } catch (ClassNotFoundException x) {
+ // try again
+ }
+ }
+ return Class.forName(iClassName).newInstance();
+ } catch (ClassNotFoundException x) {
+ throw new ConfigurationError(
+ "Provider " + iClassName + " not found", x);
+ } catch (Exception x) {
+ throw new ConfigurationError(
+ "Provider " + iClassName + " could not be
instantiated: " + x,
+ x);
+ }
+ }
+ });
+ return obj;
+ }
+
+ /**
+ * Finds the implementation Class object in the specified order. Main
+ * entry point.
+ *
+ * @param factoryId Name of the factory to find, same as
+ * a property name
+ * @param fallbackClassName Implementation class name, if nothing else
+ * is found. Use null to mean no fallback.
+ * @return Class object of factory, never null
+ * @throws FactoryFinder.ConfigurationError
+ * Package private so this code can be shared.
+ */
+ static Object find(String factoryId, String fallbackClassName)
+ throws ConfigurationError {
+
+ final String iFactoryId = factoryId;
+ final String iFallbackClassName = fallbackClassName;
+
+ Object obj =
+ doPrivileged( new PrivilegedAction() {
+ public Object run() {
+ debugPrintln("debug is on");
+
+ ClassLoader classLoader = findClassLoader();
+
+ try {
+ // If we are deployed into an OSGi
environment, leverage it
+ Class spiClass =
org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryId);
+ if (spiClass != null) {
+ return spiClass.newInstance();
+ }
+ } catch (Throwable e) {
+ }
+
+ // Use the system property first
+ try {
+ String systemProp =
+ System.getProperty(iFactoryId);
+ if (systemProp != null) {
+ debugPrintln("found system property " +
systemProp);
+ return newInstance(systemProp, classLoader);
+ }
+ } catch (SecurityException se) {
+ }
+
+ // try to read from $java.home/lib/xml.properties
+ try {
+ String javah = System.getProperty("java.home");
+ String configFile = javah + File.separator +
+ "lib" + File.separator + "jaxrpc.properties";
+ File f = new File(configFile);
+ if (f.exists()) {
+ Properties props = new Properties();
+ props.load(new FileInputStream(f));
+ String factoryClassName =
props.getProperty(iFactoryId);
+ debugPrintln("found java.home property " +
factoryClassName);
+ return newInstance(factoryClassName, classLoader);
+ }
+ } catch (Exception ex) {
+ if (debug) ex.printStackTrace();
+ }
+
+ String serviceId = "META-INF/services/" + iFactoryId;
+ // try to find services in CLASSPATH
+ try {
+ InputStream is = null;
+ if (classLoader == null) {
+ is =
ClassLoader.getSystemResourceAsStream(serviceId);
+ } else {
+ is = classLoader.getResourceAsStream(serviceId);
+ }
+
+ if (is != null) {
+ debugPrintln("found " + serviceId);
+
+ // Read the service provider name in UTF-8 as
specified in
+ // the jar spec. Unfortunately this fails in
Microsoft
+ // VJ++, which does not implement the UTF-8
+ // encoding. Theoretically, we should simply let
it fail in
+ // that case, since the JVM is obviously broken if
it
+ // doesn't support such a basic standard. But
since there
+ // are still some users attempting to use VJ++ for
+ // development, we have dropped in a fallback
which makes a
+ // second attempt using the platform's default
encoding. In
+ // VJ++ this is apparently ASCII, which is a
subset of
+ // UTF-8... and since the strings we'll be reading
here are
+ // also primarily limited to the 7-bit ASCII range
(at
+ // least, in English versions), this should work
well
+ // enough to keep us on the air until we're ready
to
+ // officially decommit from VJ++. [Edited comment
from
+ // jkesselm]
+ BufferedReader rd;
+ try {
+ rd = new BufferedReader(new
InputStreamReader(is, "UTF-8"));
+ } catch (java.io.UnsupportedEncodingException e) {
+ rd = new BufferedReader(new
InputStreamReader(is));
+ }
+
+ String factoryClassName = rd.readLine();
+ rd.close();
+
+ if (factoryClassName != null &&
+ ! "".equals(factoryClassName)) {
+ debugPrintln("loaded from services: " +
factoryClassName);
+ return newInstance(factoryClassName,
classLoader);
+ }
+ }
+ } catch (Exception ex) {
+ if (debug) ex.printStackTrace();
+ }
+
+ if (iFallbackClassName == null) {
+ throw new ConfigurationError(
+ "Provider for " + iFactoryId + " cannot be
found", null);
+ }
+
+ debugPrintln("loaded from fallback value: " +
iFallbackClassName);
+ return newInstance(iFallbackClassName, classLoader);
+ }
+ });
+ return obj;
+ }
+
+ private static Object doPrivileged(PrivilegedAction action) {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm == null) {
+ return(action.run());
+ } else {
+ return java.security.AccessController.doPrivileged(action);
+ }
+ }
+
+ static class ConfigurationError extends Error {
+ // fixme: should this be refactored to use the jdk1.4 exception
+ // wrapping?
+
+ private Exception exception;
+
+ /**
+ * Construct a new instance with the specified detail string and
+ * exception.
+ *
+ * @param msg the Message for this error
+ * @param x an Exception that caused this failure, or null
+ */
+ ConfigurationError(String msg, Exception x) {
+ super(msg);
+ this.exception = x;
}
- try {
- String prop = System.getProperty(factoryId);
- if (prop != null) {
- return loadFactory(prop, classLoader);
- }
- } catch (Exception e) {
- }
-
- if (altClassName == null) {
- throw new WebServiceException("Unable to locate factory
for " + factoryId + ".", null);
- }
- return loadFactory(altClassName, classLoader);
- }
-
- private static Object loadFactory(String className, ClassLoader
classLoader) {
- try {
- Class factoryClass = classLoader == null ?
Class.forName(className)
- :
classLoader.loadClass(className);
- return factoryClass.newInstance();
- } catch (ClassNotFoundException x) {
- throw new WebServiceException("Requested factory "
- + className + " cannot be located.
Classloader ="
- + classLoader.toString(), x);
- } catch (Exception x) {
- throw new WebServiceException("Requested factory "
- + className + " could not be
instantiated: " + x, x);
- }
- }
+ Exception getException() {
+ return exception;
+ }
+ }
}