feat(jdk8): move files to new folder to avoid resources compiled.
This commit is contained in:
@@ -0,0 +1,308 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package com.oracle.webservices.internal.api.message;
|
||||
|
||||
import com.sun.istack.internal.NotNull;
|
||||
import com.sun.istack.internal.Nullable;
|
||||
import com.sun.xml.internal.ws.api.message.Packet;
|
||||
import com.sun.xml.internal.ws.client.RequestContext;
|
||||
import com.sun.xml.internal.ws.client.ResponseContext;
|
||||
|
||||
import javax.xml.ws.WebServiceContext;
|
||||
|
||||
import java.util.AbstractMap;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.HashSet;
|
||||
import java.util.IdentityHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* {@link PropertySet} that combines properties exposed from multiple
|
||||
* {@link PropertySet}s into one.
|
||||
*
|
||||
* <p>
|
||||
* This implementation allows one {@link PropertySet} to assemble
|
||||
* all properties exposed from other "satellite" {@link PropertySet}s.
|
||||
* (A satellite may itself be a {@link DistributedPropertySet}, so
|
||||
* in general this can form a tree.)
|
||||
*
|
||||
* <p>
|
||||
* This is useful for JAX-WS because the properties we expose to the application
|
||||
* are contributed by different pieces, and therefore we'd like each of them
|
||||
* to have a separate {@link PropertySet} implementation that backs up
|
||||
* the properties. For example, this allows FastInfoset to expose its
|
||||
* set of properties to {@link RequestContext} by using a strongly-typed fields.
|
||||
*
|
||||
* <p>
|
||||
* This is also useful for a client-side transport to expose a bunch of properties
|
||||
* into {@link ResponseContext}. It simply needs to create a {@link PropertySet}
|
||||
* object with methods for each property it wants to expose, and then add that
|
||||
* {@link PropertySet} to {@link Packet}. This allows property values to be
|
||||
* lazily computed (when actually asked by users), thus improving the performance
|
||||
* of the typical case where property values are not asked.
|
||||
*
|
||||
* <p>
|
||||
* A similar benefit applies on the server-side, for a transport to expose
|
||||
* a bunch of properties to {@link WebServiceContext}.
|
||||
*
|
||||
* <p>
|
||||
* To achieve these benefits, access to {@link DistributedPropertySet} is slower
|
||||
* compared to {@link PropertySet} (such as get/set), while adding a satellite
|
||||
* object is relatively fast.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public abstract class BaseDistributedPropertySet extends BasePropertySet implements DistributedPropertySet {
|
||||
|
||||
/**
|
||||
* All {@link PropertySet}s that are bundled into this {@link PropertySet}.
|
||||
*/
|
||||
private final Map<Class<? extends com.oracle.webservices.internal.api.message.PropertySet>, PropertySet> satellites
|
||||
= new IdentityHashMap<Class<? extends com.oracle.webservices.internal.api.message.PropertySet>, PropertySet>();
|
||||
|
||||
private final Map<String, Object> viewthis;
|
||||
|
||||
public BaseDistributedPropertySet() {
|
||||
this.viewthis = super.createView();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addSatellite(@NotNull PropertySet satellite) {
|
||||
addSatellite(satellite.getClass(), satellite);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addSatellite(@NotNull Class<? extends com.oracle.webservices.internal.api.message.PropertySet> keyClass, @NotNull PropertySet satellite) {
|
||||
satellites.put(keyClass, satellite);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeSatellite(PropertySet satellite) {
|
||||
satellites.remove(satellite.getClass());
|
||||
}
|
||||
|
||||
public void copySatelliteInto(@NotNull DistributedPropertySet r) {
|
||||
for (Map.Entry<Class<? extends com.oracle.webservices.internal.api.message.PropertySet>, PropertySet> entry : satellites.entrySet()) {
|
||||
r.addSatellite(entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copySatelliteInto(MessageContext r) {
|
||||
copySatelliteInto((DistributedPropertySet)r);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable <T extends com.oracle.webservices.internal.api.message.PropertySet> T getSatellite(Class<T> satelliteClass) {
|
||||
T satellite = (T) satellites.get(satelliteClass);
|
||||
if (satellite != null) {
|
||||
return satellite;
|
||||
}
|
||||
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if (satelliteClass.isInstance(child)) {
|
||||
return satelliteClass.cast(child);
|
||||
}
|
||||
|
||||
if (DistributedPropertySet.class.isInstance(child)) {
|
||||
satellite = DistributedPropertySet.class.cast(child).getSatellite(satelliteClass);
|
||||
if (satellite != null) {
|
||||
return satellite;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Class<? extends com.oracle.webservices.internal.api.message.PropertySet>, com.oracle.webservices.internal.api.message.PropertySet> getSatellites() {
|
||||
return satellites;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(Object key) {
|
||||
// check satellites
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if (child.supports(key)) {
|
||||
return child.get(key);
|
||||
}
|
||||
}
|
||||
|
||||
// otherwise it must be the master
|
||||
return super.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object put(String key, Object value) {
|
||||
// check satellites
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if(child.supports(key)) {
|
||||
return child.put(key,value);
|
||||
}
|
||||
}
|
||||
|
||||
// otherwise it must be the master
|
||||
return super.put(key,value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsKey(Object key) {
|
||||
if (viewthis.containsKey(key))
|
||||
return true;
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if (child.containsKey(key)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supports(Object key) {
|
||||
// check satellites
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if (child.supports(key)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return super.supports(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object remove(Object key) {
|
||||
// check satellites
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if (child.supports(key)) {
|
||||
return child.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
return super.remove(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createEntrySet(Set<Entry<String, Object>> core) {
|
||||
super.createEntrySet(core);
|
||||
for (PropertySet child : satellites.values()) {
|
||||
((BasePropertySet) child).createEntrySet(core);
|
||||
}
|
||||
}
|
||||
|
||||
protected Map<String, Object> asMapLocal() {
|
||||
return viewthis;
|
||||
}
|
||||
|
||||
protected boolean supportsLocal(Object key) {
|
||||
return super.supports(key);
|
||||
}
|
||||
|
||||
class DistributedMapView extends AbstractMap<String, Object> {
|
||||
@Override
|
||||
public Object get(Object key) {
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if (child.supports(key)) {
|
||||
return child.get(key);
|
||||
}
|
||||
}
|
||||
|
||||
return viewthis.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
int size = viewthis.size();
|
||||
for (PropertySet child : satellites.values()) {
|
||||
size += child.asMap().size();
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsKey(Object key) {
|
||||
if (viewthis.containsKey(key))
|
||||
return true;
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if (child.containsKey(key))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Entry<String, Object>> entrySet() {
|
||||
Set<Entry<String, Object>> entries = new HashSet<Entry<String, Object>>();
|
||||
for (PropertySet child : satellites.values()) {
|
||||
for (Entry<String,Object> entry : child.asMap().entrySet()) {
|
||||
// the code below is here to avoid entries.addAll(child.asMap().entrySet()); which works differently on JDK6/7
|
||||
// see DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS
|
||||
entries.add(new SimpleImmutableEntry<String, Object>(entry.getKey(), entry.getValue()));
|
||||
}
|
||||
}
|
||||
for (Entry<String,Object> entry : viewthis.entrySet()) {
|
||||
// the code below is here to avoid entries.addAll(child.asMap().entrySet()); which works differently on JDK6/7
|
||||
// see DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS
|
||||
entries.add(new SimpleImmutableEntry<String, Object>(entry.getKey(), entry.getValue()));
|
||||
}
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object put(String key, Object value) {
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if (child.supports(key)) {
|
||||
return child.put(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
return viewthis.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
satellites.clear();
|
||||
viewthis.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object remove(Object key) {
|
||||
for (PropertySet child : satellites.values()) {
|
||||
if (child.supports(key)) {
|
||||
return child.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
return viewthis.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Map<String, Object> createView() {
|
||||
return new DistributedMapView();
|
||||
}
|
||||
}
|
@@ -0,0 +1,548 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package com.oracle.webservices.internal.api.message;
|
||||
|
||||
import com.sun.istack.internal.NotNull;
|
||||
import com.sun.istack.internal.Nullable;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.AbstractMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
/**
|
||||
* A set of "properties" that can be accessed via strongly-typed fields
|
||||
* as well as reflexibly through the property name.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
@SuppressWarnings("SuspiciousMethodCalls")
|
||||
public abstract class BasePropertySet implements PropertySet {
|
||||
|
||||
/**
|
||||
* Creates a new instance of TypedMap.
|
||||
*/
|
||||
protected BasePropertySet() {
|
||||
}
|
||||
|
||||
private Map<String,Object> mapView;
|
||||
|
||||
/**
|
||||
* Represents the list of strongly-typed known properties
|
||||
* (keyed by property names.)
|
||||
*
|
||||
* <p>
|
||||
* Just giving it an alias to make the use of this class more fool-proof.
|
||||
*/
|
||||
protected static class PropertyMap extends HashMap<String,Accessor> {
|
||||
|
||||
// the entries are often being iterated through so performance can be improved
|
||||
// by their caching instead of iterating through the original (immutable) map each time
|
||||
transient PropertyMapEntry[] cachedEntries = null;
|
||||
|
||||
PropertyMapEntry[] getPropertyMapEntries() {
|
||||
if (cachedEntries == null) {
|
||||
cachedEntries = createPropertyMapEntries();
|
||||
}
|
||||
return cachedEntries;
|
||||
}
|
||||
|
||||
private PropertyMapEntry[] createPropertyMapEntries() {
|
||||
final PropertyMapEntry[] modelEntries = new PropertyMapEntry[size()];
|
||||
int i = 0;
|
||||
for (final Entry<String, Accessor> e : entrySet()) {
|
||||
modelEntries[i++] = new PropertyMapEntry(e.getKey(), e.getValue());
|
||||
}
|
||||
return modelEntries;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* PropertyMapEntry represents a Map.Entry in the PropertyMap with more efficient access.
|
||||
*/
|
||||
static public class PropertyMapEntry {
|
||||
public PropertyMapEntry(String k, Accessor v) {
|
||||
key = k; value = v;
|
||||
}
|
||||
String key;
|
||||
Accessor value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map representing the Fields and Methods annotated with {@link PropertySet.Property}.
|
||||
* Model of {@link PropertySet} class.
|
||||
*
|
||||
* <p>
|
||||
* At the end of the derivation chain this method just needs to be implemented
|
||||
* as:
|
||||
*
|
||||
* <pre>
|
||||
* private static final PropertyMap model;
|
||||
* static {
|
||||
* model = parse(MyDerivedClass.class);
|
||||
* }
|
||||
* protected PropertyMap getPropertyMap() {
|
||||
* return model;
|
||||
* }
|
||||
* </pre>
|
||||
*/
|
||||
protected abstract PropertyMap getPropertyMap();
|
||||
|
||||
/**
|
||||
* This method parses a class for fields and methods with {@link PropertySet.Property}.
|
||||
*/
|
||||
protected static PropertyMap parse(final Class clazz) {
|
||||
// make all relevant fields and methods accessible.
|
||||
// this allows runtime to skip the security check, so they runs faster.
|
||||
return AccessController.doPrivileged(new PrivilegedAction<PropertyMap>() {
|
||||
@Override
|
||||
public PropertyMap run() {
|
||||
PropertyMap props = new PropertyMap();
|
||||
for (Class c=clazz; c!=null; c=c.getSuperclass()) {
|
||||
for (Field f : c.getDeclaredFields()) {
|
||||
Property cp = f.getAnnotation(Property.class);
|
||||
if(cp!=null) {
|
||||
for(String value : cp.value()) {
|
||||
props.put(value, new FieldAccessor(f, value));
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Method m : c.getDeclaredMethods()) {
|
||||
Property cp = m.getAnnotation(Property.class);
|
||||
if(cp!=null) {
|
||||
String name = m.getName();
|
||||
assert name.startsWith("get") || name.startsWith("is");
|
||||
|
||||
String setName = name.startsWith("is") ? "set"+name.substring(2) : // isFoo -> setFoo
|
||||
's' +name.substring(1); // getFoo -> setFoo
|
||||
Method setter;
|
||||
try {
|
||||
setter = clazz.getMethod(setName,m.getReturnType());
|
||||
} catch (NoSuchMethodException e) {
|
||||
setter = null; // no setter
|
||||
}
|
||||
for(String value : cp.value()) {
|
||||
props.put(value, new MethodAccessor(m, setter, value));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return props;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a typed property defined on a {@link PropertySet}.
|
||||
*/
|
||||
protected interface Accessor {
|
||||
String getName();
|
||||
boolean hasValue(PropertySet props);
|
||||
Object get(PropertySet props);
|
||||
void set(PropertySet props, Object value);
|
||||
}
|
||||
|
||||
static final class FieldAccessor implements Accessor {
|
||||
/**
|
||||
* Field with the annotation.
|
||||
*/
|
||||
private final Field f;
|
||||
|
||||
/**
|
||||
* One of the values in {@link Property} annotation on {@link #f}.
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
protected FieldAccessor(Field f, String name) {
|
||||
this.f = f;
|
||||
f.setAccessible(true);
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasValue(PropertySet props) {
|
||||
return get(props)!=null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(PropertySet props) {
|
||||
try {
|
||||
return f.get(props);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(PropertySet props, Object value) {
|
||||
try {
|
||||
f.set(props,value);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static final class MethodAccessor implements Accessor {
|
||||
/**
|
||||
* Getter method.
|
||||
*/
|
||||
private final @NotNull Method getter;
|
||||
/**
|
||||
* Setter method.
|
||||
* Some property is read-only.
|
||||
*/
|
||||
private final @Nullable Method setter;
|
||||
|
||||
/**
|
||||
* One of the values in {@link Property} annotation on {@link #getter}.
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
protected MethodAccessor(Method getter, Method setter, String value) {
|
||||
this.getter = getter;
|
||||
this.setter = setter;
|
||||
this.name = value;
|
||||
getter.setAccessible(true);
|
||||
if (setter!=null) {
|
||||
setter.setAccessible(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasValue(PropertySet props) {
|
||||
return get(props)!=null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(PropertySet props) {
|
||||
try {
|
||||
return getter.invoke(props);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new AssertionError();
|
||||
} catch (InvocationTargetException e) {
|
||||
handle(e);
|
||||
return 0; // never reach here
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(PropertySet props, Object value) {
|
||||
if(setter==null) {
|
||||
throw new ReadOnlyPropertyException(getName());
|
||||
}
|
||||
try {
|
||||
setter.invoke(props,value);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new AssertionError();
|
||||
} catch (InvocationTargetException e) {
|
||||
handle(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Since we don't expect the getter/setter to throw a checked exception,
|
||||
* it should be possible to make the exception propagation transparent.
|
||||
* That's what we are trying to do here.
|
||||
*/
|
||||
private Exception handle(InvocationTargetException e) {
|
||||
Throwable t = e.getTargetException();
|
||||
if (t instanceof Error) {
|
||||
throw (Error)t;
|
||||
}
|
||||
if (t instanceof RuntimeException) {
|
||||
throw (RuntimeException)t;
|
||||
}
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Class allowing to work with PropertySet object as with a Map; it doesn't only allow to read properties from
|
||||
* the map but also to modify the map in a way it is in sync with original strongly typed fields. It also allows
|
||||
* (if necessary) to store additional properties those can't be found in strongly typed fields.
|
||||
*
|
||||
* @see com.sun.xml.internal.ws.api.PropertySet#asMap() method
|
||||
*/
|
||||
final class MapView extends HashMap<String, Object> {
|
||||
|
||||
// flag if it should allow store also different properties
|
||||
// than the from strongly typed fields
|
||||
boolean extensible;
|
||||
|
||||
MapView(boolean extensible) {
|
||||
super(getPropertyMap().getPropertyMapEntries().length);
|
||||
this.extensible = extensible;
|
||||
initialize();
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
// iterate (cached) array instead of map to speed things up ...
|
||||
PropertyMapEntry[] entries = getPropertyMap().getPropertyMapEntries();
|
||||
for (PropertyMapEntry entry : entries) {
|
||||
super.put(entry.key, entry.value);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(Object key) {
|
||||
Object o = super.get(key);
|
||||
if (o instanceof Accessor) {
|
||||
return ((Accessor) o).get(BasePropertySet.this);
|
||||
} else {
|
||||
return o;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Entry<String, Object>> entrySet() {
|
||||
Set<Entry<String, Object>> entries = new HashSet<Entry<String, Object>>();
|
||||
for (String key : keySet()) {
|
||||
entries.add(new SimpleImmutableEntry<String, Object>(key, get(key)));
|
||||
}
|
||||
return entries;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object put(String key, Object value) {
|
||||
|
||||
Object o = super.get(key);
|
||||
if (o != null && o instanceof Accessor) {
|
||||
|
||||
Object oldValue = ((Accessor) o).get(BasePropertySet.this);
|
||||
((Accessor) o).set(BasePropertySet.this, value);
|
||||
return oldValue;
|
||||
|
||||
} else {
|
||||
|
||||
if (extensible) {
|
||||
return super.put(key, value);
|
||||
} else {
|
||||
throw new IllegalStateException("Unknown property [" + key + "] for PropertySet [" +
|
||||
BasePropertySet.this.getClass().getName() + "]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
for (String key : keySet()) {
|
||||
remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object remove(Object key) {
|
||||
Object o;
|
||||
o = super.get(key);
|
||||
if (o instanceof Accessor) {
|
||||
((Accessor)o).set(BasePropertySet.this, null);
|
||||
}
|
||||
return super.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsKey(Object key) {
|
||||
Accessor sp = getPropertyMap().get(key);
|
||||
if (sp != null) {
|
||||
return sp.get(this) != null;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the name of the property.
|
||||
*
|
||||
* @param key
|
||||
* This field is typed as {@link Object} to follow the {@link Map#get(Object)}
|
||||
* convention, but if anything but {@link String} is passed, this method
|
||||
* just returns null.
|
||||
*/
|
||||
@Override
|
||||
public Object get(Object key) {
|
||||
Accessor sp = getPropertyMap().get(key);
|
||||
if (sp != null) {
|
||||
return sp.get(this);
|
||||
}
|
||||
throw new IllegalArgumentException("Undefined property "+key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a property.
|
||||
*
|
||||
* <h3>Implementation Note</h3>
|
||||
* This method is slow. Code inside JAX-WS should define strongly-typed
|
||||
* fields in this class and access them directly, instead of using this.
|
||||
*
|
||||
* @throws ReadOnlyPropertyException
|
||||
* if the given key is an alias of a strongly-typed field,
|
||||
* and if the name object given is not assignable to the field.
|
||||
*
|
||||
* @see Property
|
||||
*/
|
||||
@Override
|
||||
public Object put(String key, Object value) {
|
||||
Accessor sp = getPropertyMap().get(key);
|
||||
if(sp!=null) {
|
||||
Object old = sp.get(this);
|
||||
sp.set(this,value);
|
||||
return old;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Undefined property "+key);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this {@link PropertySet} supports a property of the given name.
|
||||
*/
|
||||
@Override
|
||||
public boolean supports(Object key) {
|
||||
return getPropertyMap().containsKey(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object remove(Object key) {
|
||||
Accessor sp = getPropertyMap().get(key);
|
||||
if(sp!=null) {
|
||||
Object old = sp.get(this);
|
||||
sp.set(this,null);
|
||||
return old;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Undefined property "+key);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a {@link Map} view of this {@link PropertySet}.
|
||||
*
|
||||
* <p>
|
||||
* This map is partially live, in the sense that values you set to it
|
||||
* will be reflected to {@link PropertySet}.
|
||||
*
|
||||
* <p>
|
||||
* However, this map may not pick up changes made
|
||||
* to {@link PropertySet} after the view is created.
|
||||
*
|
||||
* @deprecated use newer implementation {@link PropertySet#asMap()} which produces
|
||||
* readwrite {@link Map}
|
||||
*
|
||||
* @return
|
||||
* always non-null valid instance.
|
||||
*/
|
||||
@Deprecated
|
||||
@Override
|
||||
public final Map<String,Object> createMapView() {
|
||||
final Set<Entry<String,Object>> core = new HashSet<Entry<String,Object>>();
|
||||
createEntrySet(core);
|
||||
|
||||
return new AbstractMap<String, Object>() {
|
||||
@Override
|
||||
public Set<Entry<String,Object>> entrySet() {
|
||||
return core;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a modifiable {@link Map} view of this {@link PropertySet}.
|
||||
* <p/>
|
||||
* Changes done on this {@link Map} or on {@link PropertySet} object work in both directions - values made to
|
||||
* {@link Map} are reflected to {@link PropertySet} and changes done using getters/setters on {@link PropertySet}
|
||||
* object are automatically reflected in this {@link Map}.
|
||||
* <p/>
|
||||
* If necessary, it also can hold other values (not present on {@link PropertySet}) -
|
||||
* {@see PropertySet#mapAllowsAdditionalProperties}
|
||||
*
|
||||
* @return always non-null valid instance.
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> asMap() {
|
||||
if (mapView == null) {
|
||||
mapView = createView();
|
||||
}
|
||||
return mapView;
|
||||
}
|
||||
|
||||
protected Map<String, Object> createView() {
|
||||
return new MapView(mapAllowsAdditionalProperties());
|
||||
}
|
||||
|
||||
/**
|
||||
* Used when constructing the {@link MapView} for this object - it controls if the {@link MapView} servers only to
|
||||
* access strongly typed values or allows also different values
|
||||
*
|
||||
* @return true if {@link Map} should allow also properties not defined as strongly typed fields
|
||||
*/
|
||||
protected boolean mapAllowsAdditionalProperties() {
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void createEntrySet(Set<Entry<String,Object>> core) {
|
||||
for (final Entry<String, Accessor> e : getPropertyMap().entrySet()) {
|
||||
core.add(new Entry<String, Object>() {
|
||||
@Override
|
||||
public String getKey() {
|
||||
return e.getKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getValue() {
|
||||
return e.getValue().get(BasePropertySet.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object setValue(Object value) {
|
||||
Accessor acc = e.getValue();
|
||||
Object old = acc.get(BasePropertySet.this);
|
||||
acc.set(BasePropertySet.this,value);
|
||||
return old;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package com.oracle.webservices.internal.api.message;
|
||||
|
||||
//TODO Do we want to remove this implementation dependency?
|
||||
import com.sun.xml.internal.ws.encoding.ContentTypeImpl;
|
||||
|
||||
/**
|
||||
* A Content-Type transport header that will be returned by {@link MessageContext#write(java.io.OutputStream)}.
|
||||
* It will provide the Content-Type header and also take care of SOAP 1.1 SOAPAction header.
|
||||
*
|
||||
* @author Vivek Pandey
|
||||
*/
|
||||
public interface ContentType {
|
||||
|
||||
/**
|
||||
* Gives non-null Content-Type header value.
|
||||
*/
|
||||
public String getContentType();
|
||||
|
||||
/**
|
||||
* Gives SOAPAction transport header value. It will be non-null only for SOAP 1.1 messages. In other cases
|
||||
* it MUST be null. The SOAPAction transport header should be written out only when its non-null.
|
||||
*
|
||||
* @return It can be null, in that case SOAPAction header should be written.
|
||||
*/
|
||||
public String getSOAPActionHeader();
|
||||
|
||||
/**
|
||||
* Controls the Accept transport header, if the transport supports it.
|
||||
* Returning null means the transport need not add any new header.
|
||||
*
|
||||
* <p>
|
||||
* We realize that this is not an elegant abstraction, but
|
||||
* this would do for now. If another person comes and asks for
|
||||
* a similar functionality, we'll define a real abstraction.
|
||||
*/
|
||||
public String getAcceptHeader();
|
||||
|
||||
static public class Builder {
|
||||
private String contentType;
|
||||
private String soapAction;
|
||||
private String accept;
|
||||
private String charset;
|
||||
|
||||
public Builder contentType(String s) {contentType = s; return this; }
|
||||
public Builder soapAction (String s) {soapAction = s; return this; }
|
||||
public Builder accept (String s) {accept = s; return this; }
|
||||
public Builder charset (String s) {charset = s; return this; }
|
||||
public ContentType build() {
|
||||
//TODO Do we want to remove this implementation dependency?
|
||||
return new ContentTypeImpl(contentType, soapAction, accept, charset);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package com.oracle.webservices.internal.api.message;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.sun.istack.internal.Nullable;
|
||||
|
||||
/**
|
||||
* {@link PropertySet} that combines properties exposed from multiple
|
||||
* {@link PropertySet}s into one.
|
||||
*
|
||||
* <p>
|
||||
* This implementation allows one {@link PropertySet} to assemble
|
||||
* all properties exposed from other "satellite" {@link PropertySet}s.
|
||||
* (A satellite may itself be a {@link DistributedPropertySet}, so
|
||||
* in general this can form a tree.)
|
||||
*
|
||||
* <p>
|
||||
* This is useful for JAX-WS because the properties we expose to the application
|
||||
* are contributed by different pieces, and therefore we'd like each of them
|
||||
* to have a separate {@link PropertySet} implementation that backs up
|
||||
* the properties. For example, this allows FastInfoset to expose its
|
||||
* set of properties to {@link RequestContext} by using a strongly-typed fields.
|
||||
*
|
||||
* <p>
|
||||
* This is also useful for a client-side transport to expose a bunch of properties
|
||||
* into {@link ResponseContext}. It simply needs to create a {@link PropertySet}
|
||||
* object with methods for each property it wants to expose, and then add that
|
||||
* {@link PropertySet} to {@link Packet}. This allows property values to be
|
||||
* lazily computed (when actually asked by users), thus improving the performance
|
||||
* of the typical case where property values are not asked.
|
||||
*
|
||||
* <p>
|
||||
* A similar benefit applies on the server-side, for a transport to expose
|
||||
* a bunch of properties to {@link WebServiceContext}.
|
||||
*
|
||||
* <p>
|
||||
* To achieve these benefits, access to {@link DistributedPropertySet} is slower
|
||||
* compared to {@link PropertySet} (such as get/set), while adding a satellite
|
||||
* object is relatively fast.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public interface DistributedPropertySet extends com.oracle.webservices.internal.api.message.PropertySet {
|
||||
|
||||
public @Nullable <T extends com.oracle.webservices.internal.api.message.PropertySet> T getSatellite(Class<T> satelliteClass);
|
||||
|
||||
public Map<Class<? extends com.oracle.webservices.internal.api.message.PropertySet>, com.oracle.webservices.internal.api.message.PropertySet> getSatellites();
|
||||
|
||||
public void addSatellite(com.oracle.webservices.internal.api.message.PropertySet satellite);
|
||||
|
||||
public void addSatellite(Class<? extends com.oracle.webservices.internal.api.message.PropertySet> keyClass, com.oracle.webservices.internal.api.message.PropertySet satellite);
|
||||
|
||||
public void removeSatellite(com.oracle.webservices.internal.api.message.PropertySet satellite);
|
||||
|
||||
public void copySatelliteInto(com.oracle.webservices.internal.api.message.MessageContext r);
|
||||
}
|
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package com.oracle.webservices.internal.api.message;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.WritableByteChannel;
|
||||
|
||||
import javax.xml.soap.SOAPException;
|
||||
import javax.xml.soap.SOAPMessage;
|
||||
|
||||
/**
|
||||
* MessageContext represents a container of a SOAP message and all the properties
|
||||
* including the transport headers.
|
||||
*
|
||||
* MessageContext is a composite {@link PropertySet} that combines properties exposed from multiple
|
||||
* {@link PropertySet}s into one.
|
||||
*
|
||||
* <p>
|
||||
* This implementation allows one {@link PropertySet} to assemble
|
||||
* all properties exposed from other "satellite" {@link PropertySet}s.
|
||||
* (A satellite may itself be a {@link DistributedPropertySet}, so
|
||||
* in general this can form a tree.)
|
||||
*
|
||||
* @author shih-chang.chen@oracle.com
|
||||
*/
|
||||
public interface MessageContext extends DistributedPropertySet {
|
||||
/**
|
||||
* Gets the SAAJ SOAPMessage representation of the SOAP message.
|
||||
*
|
||||
* @return The SOAPMessage
|
||||
*/
|
||||
SOAPMessage getAsSOAPMessage() throws SOAPException;
|
||||
|
||||
/**
|
||||
* Gets the SAAJ SOAPMessage representation of the SOAP message.
|
||||
* @deprecated use getAsSOAPMessage
|
||||
* @return The SOAPMessage
|
||||
*/
|
||||
SOAPMessage getSOAPMessage() throws SOAPException;
|
||||
|
||||
/**
|
||||
* Writes the XML infoset portion of this MessageContext
|
||||
* (from <soap:Envelope> to </soap:Envelope>).
|
||||
*
|
||||
* @param out
|
||||
* Must not be null. The caller is responsible for closing the stream,
|
||||
* not the callee.
|
||||
*
|
||||
* @return
|
||||
* The MIME content type of the encoded message (such as "application/xml").
|
||||
* This information is often ncessary by transport.
|
||||
*
|
||||
* @throws IOException
|
||||
* if a {@link OutputStream} throws {@link IOException}.
|
||||
*/
|
||||
ContentType writeTo( OutputStream out ) throws IOException;
|
||||
|
||||
/**
|
||||
* The version of {@link #writeTo(OutputStream)}
|
||||
* that writes to NIO {@link ByteBuffer}.
|
||||
*
|
||||
* <p>
|
||||
* TODO: for the convenience of implementation, write
|
||||
* an adapter that wraps {@link WritableByteChannel} to {@link OutputStream}.
|
||||
*/
|
||||
// ContentType writeTo( WritableByteChannel buffer );
|
||||
|
||||
/**
|
||||
* Gets the Content-type of this message. For an out-bound message that this getContentType()
|
||||
* method returns a null, the Content-Type can be determined only by calling the writeTo
|
||||
* method to write the MessageContext to an OutputStream.
|
||||
*
|
||||
* @return The MIME content type of this message
|
||||
*/
|
||||
ContentType getContentType();
|
||||
}
|
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package com.oracle.webservices.internal.api.message;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import com.oracle.webservices.internal.api.EnvelopeStyle;
|
||||
import com.sun.xml.internal.ws.api.SOAPVersion; // TODO leaking RI APIs
|
||||
import com.sun.xml.internal.ws.util.ServiceFinder;
|
||||
|
||||
import javax.xml.soap.MimeHeaders;
|
||||
import javax.xml.soap.SOAPMessage;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.ws.WebServiceFeature;
|
||||
|
||||
public abstract class MessageContextFactory
|
||||
{
|
||||
private static final MessageContextFactory DEFAULT = new com.sun.xml.internal.ws.api.message.MessageContextFactory(new WebServiceFeature[0]);
|
||||
|
||||
protected abstract MessageContextFactory newFactory(WebServiceFeature ... f);
|
||||
|
||||
public abstract MessageContext createContext();
|
||||
|
||||
public abstract MessageContext createContext(SOAPMessage m);
|
||||
|
||||
public abstract MessageContext createContext(Source m);
|
||||
|
||||
public abstract MessageContext createContext(Source m, EnvelopeStyle.Style envelopeStyle);
|
||||
|
||||
public abstract MessageContext createContext(InputStream in, String contentType) throws IOException;
|
||||
|
||||
/**
|
||||
* @deprecated http://java.net/jira/browse/JAX_WS-1077
|
||||
*/
|
||||
@Deprecated
|
||||
public abstract MessageContext createContext(InputStream in, MimeHeaders headers) throws IOException;
|
||||
|
||||
static public MessageContextFactory createFactory(WebServiceFeature ... f) {
|
||||
return createFactory(null, f);
|
||||
}
|
||||
|
||||
static public MessageContextFactory createFactory(ClassLoader cl, WebServiceFeature ...f) {
|
||||
for (MessageContextFactory factory : ServiceFinder.find(MessageContextFactory.class, cl)) {
|
||||
MessageContextFactory newfac = factory.newFactory(f);
|
||||
if (newfac != null) return newfac;
|
||||
}
|
||||
return new com.sun.xml.internal.ws.api.message.MessageContextFactory(f);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public abstract MessageContext doCreate();
|
||||
|
||||
@Deprecated
|
||||
public abstract MessageContext doCreate(SOAPMessage m);
|
||||
|
||||
//public abstract MessageContext doCreate(InputStream x);
|
||||
|
||||
@Deprecated
|
||||
public abstract MessageContext doCreate(Source x, SOAPVersion soapVersion);
|
||||
|
||||
@Deprecated
|
||||
public static MessageContext create(final ClassLoader... classLoader) {
|
||||
return serviceFinder(classLoader,
|
||||
new Creator() {
|
||||
public MessageContext create(final MessageContextFactory f) {
|
||||
return f.doCreate();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static MessageContext create(final SOAPMessage m, final ClassLoader... classLoader) {
|
||||
return serviceFinder(classLoader,
|
||||
new Creator() {
|
||||
public MessageContext create(final MessageContextFactory f) {
|
||||
return f.doCreate(m);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static MessageContext create(final Source m, final SOAPVersion v, final ClassLoader... classLoader) {
|
||||
return serviceFinder(classLoader,
|
||||
new Creator() {
|
||||
public MessageContext create(final MessageContextFactory f) {
|
||||
return f.doCreate(m, v);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
private static MessageContext serviceFinder(final ClassLoader[] classLoader, final Creator creator) {
|
||||
final ClassLoader cl = classLoader.length == 0 ? null : classLoader[0];
|
||||
for (MessageContextFactory factory : ServiceFinder.find(MessageContextFactory.class, cl)) {
|
||||
final MessageContext messageContext = creator.create(factory);
|
||||
if (messageContext != null)
|
||||
return messageContext;
|
||||
}
|
||||
return creator.create(DEFAULT);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
private static interface Creator {
|
||||
public MessageContext create(MessageContextFactory f);
|
||||
}
|
||||
}
|
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package com.oracle.webservices.internal.api.message;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Inherited;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.ws.handler.MessageContext;
|
||||
|
||||
/**
|
||||
* A set of "properties" that can be accessed via strongly-typed fields
|
||||
* as well as reflexibly through the property name.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public interface PropertySet {
|
||||
|
||||
/**
|
||||
* Marks a field on {@link PropertySet} as a
|
||||
* property of {@link MessageContext}.
|
||||
*
|
||||
* <p>
|
||||
* To make the runtime processing easy, this annotation
|
||||
* must be on a public field (since the property name
|
||||
* can be set through {@link Map} anyway, you won't be
|
||||
* losing abstraction by doing so.)
|
||||
*
|
||||
* <p>
|
||||
* For similar reason, this annotation can be only placed
|
||||
* on a reference type, not primitive type.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
@Inherited
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.FIELD,ElementType.METHOD})
|
||||
public @interface Property {
|
||||
/**
|
||||
* Name of the property.
|
||||
*/
|
||||
String[] value();
|
||||
}
|
||||
|
||||
public boolean containsKey(Object key);
|
||||
|
||||
/**
|
||||
* Gets the name of the property.
|
||||
*
|
||||
* @param key
|
||||
* This field is typed as {@link Object} to follow the {@link Map#get(Object)}
|
||||
* convention, but if anything but {@link String} is passed, this method
|
||||
* just returns null.
|
||||
*/
|
||||
public Object get(Object key);
|
||||
|
||||
/**
|
||||
* Sets a property.
|
||||
*
|
||||
* <h3>Implementation Note</h3>
|
||||
* This method is slow. Code inside JAX-WS should define strongly-typed
|
||||
* fields in this class and access them directly, instead of using this.
|
||||
*
|
||||
* @see Property
|
||||
*/
|
||||
public Object put(String key, Object value);
|
||||
|
||||
/**
|
||||
* Checks if this {@link PropertySet} supports a property of the given name.
|
||||
*/
|
||||
public boolean supports(Object key);
|
||||
|
||||
public Object remove(Object key);
|
||||
|
||||
/**
|
||||
* Creates a {@link Map} view of this {@link PropertySet}.
|
||||
*
|
||||
* <p>
|
||||
* This map is partially live, in the sense that values you set to it
|
||||
* will be reflected to {@link PropertySet}.
|
||||
*
|
||||
* <p>
|
||||
* However, this map may not pick up changes made
|
||||
* to {@link PropertySet} after the view is created.
|
||||
*
|
||||
* @deprecated use newer implementation {@link com.sun.xml.internal.ws.api.PropertySet#asMap()} which produces
|
||||
* readwrite {@link Map}
|
||||
*
|
||||
* @return
|
||||
* always non-null valid instance.
|
||||
*/
|
||||
@Deprecated
|
||||
public Map<String,Object> createMapView();
|
||||
|
||||
/**
|
||||
* Creates a modifiable {@link Map} view of this {@link PropertySet}.
|
||||
* <p/>
|
||||
* Changes done on this {@link Map} or on {@link PropertySet} object work in both directions - values made to
|
||||
* {@link Map} are reflected to {@link PropertySet} and changes done using getters/setters on {@link PropertySet}
|
||||
* object are automatically reflected in this {@link Map}.
|
||||
* <p/>
|
||||
* If necessary, it also can hold other values (not present on {@link PropertySet}) -
|
||||
* {@see PropertySet#mapAllowsAdditionalProperties}
|
||||
*
|
||||
* @return always non-null valid instance.
|
||||
*/
|
||||
public Map<String, Object> asMap();
|
||||
}
|
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package com.oracle.webservices.internal.api.message;
|
||||
|
||||
/**
|
||||
* Used to indicate that {@link PropertySet#put(String, Object)} failed
|
||||
* because a property is read-only.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class ReadOnlyPropertyException extends IllegalArgumentException {
|
||||
private final String propertyName;
|
||||
|
||||
public ReadOnlyPropertyException(String propertyName) {
|
||||
super(propertyName+" is a read-only property.");
|
||||
this.propertyName = propertyName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the name of the property that was read-only.
|
||||
*/
|
||||
public String getPropertyName() {
|
||||
return propertyName;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user