@Override
public boolean introspect(DataType dataType, final Operation operation) {
Class javaType = dataType.getPhysical();
// Allow privileged access to read system properties. Requires PropertyPermission
// java.specification.version read in security policy.
final HelperContext context = AccessController.doPrivileged(new PrivilegedAction<HelperContext>() {
public HelperContext run() {
return SDOContextHelper.getHelperContext(operation);
}
});
final Type type = context.getTypeHelper().getType(javaType);
if (type == null) {
// FIXME: Need a better to test dynamic SDO
// TUSCANY-3298: get underlying element type for collections
boolean isMany = false;
if (Collection.class.isAssignableFrom(javaType)) {
java.lang.reflect.Type genericType = dataType.getGenericType();
if (genericType instanceof ParameterizedType) {
java.lang.reflect.Type actualType = ((ParameterizedType)genericType).getActualTypeArguments()[0];
if (actualType instanceof Class) {
javaType = (Class)actualType;
isMany = true;
}
}
}
if (DataObject.class.isAssignableFrom(javaType)) {
// Dynamic SDO
dataType.setDataBinding(getName());
// TUSCANY-3298: use XMLType many value to indicate a collection
Object logical = dataType.getLogical();
if (logical == null) {
if (!isMany) {
dataType.setLogical(XMLType.UNKNOWN);
} else {
XMLType xmlType = new XMLType(null, null);
xmlType.setMany(true);
dataType.setLogical(xmlType);
}
} else if (logical instanceof XMLType && isMany) {
((XMLType)logical).setMany(true);
}
return true;
}
return false;
}
if (type.isDataType()) {
// FIXME: Ignore simple types?
return false;
}
// Found a SDO type, replace the default context with a private one
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
if (context == SDOContextHelper.getDefaultHelperContext()) {
HelperContext newContext = SDOUtil.createHelperContext();
SDOContextHelper.register(newContext, type);
if (operation != null) {
operation.getInputType().setMetaData(HelperContext.class, newContext);
}
} else {