package org.jboss.iiop.rmi;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Iterator;
public class RmiIdlUtil {
public static boolean hasLegalRMIIIOPArguments(Method method) {
Class[] params = method.getParameterTypes();
for (int i = 0; i < params.length; ++i)
if (!isRMIIIOPType(params[i]))
return false;
return true;
}
public static boolean hasLegalRMIIIOPReturnType(Method method) {
return isRMIIIOPType(method.getReturnType());
}
public static boolean hasLegalRMIIIOPExceptionTypes(Method method) {
Iterator it = Arrays.asList(method.getExceptionTypes()).iterator();
while (it.hasNext()) {
Class exception = (Class)it.next();
if (!isRMIIDLExceptionType(exception))
return false;
}
return true;
}
public static boolean throwsRemoteException(Method method) {
Class[] exception = method.getExceptionTypes();
for (int i = 0; i < exception.length; ++i)
if (java.rmi.RemoteException.class.isAssignableFrom(exception[i]))
return true;
return false;
}
public static boolean isStatic(Member member) {
return (Modifier.isStatic(member.getModifiers()));
}
public static boolean isStatic(Class c) {
return (Modifier.isStatic(c.getModifiers()));
}
public static boolean isFinal(Member member) {
return (Modifier.isFinal(member.getModifiers()));
}
public static boolean isFinal(Class c) {
return (Modifier.isFinal(c.getModifiers()));
}
public static boolean isPublic(Member member) {
return (Modifier.isPublic(member.getModifiers()));
}
public static boolean isPublic(Class c) {
return (Modifier.isPublic(c.getModifiers()));
}
public static boolean isAllFieldsPublic(Class c) {
try {
Field list[] = c.getFields();
for(int i=0; i<list.length; i++)
if(!Modifier.isPublic(list[i].getModifiers()))
return false;
} catch(Exception e) {
return false;
}
return true;
}
public static boolean isAbstract(Class c) {
return (Modifier.isAbstract(c.getModifiers()));
}
public static boolean isRMIIIOPType(Class type) {
if (type.isPrimitive())
return true;
if (type.isArray())
return isRMIIIOPType(type.getComponentType());
if (org.omg.CORBA.Object.class.isAssignableFrom(type))
return true;
if (org.omg.CORBA.portable.IDLEntity.class.isAssignableFrom(type))
return true;
if (isRMIIDLRemoteInterface(type))
return true;
if (isRMIIDLExceptionType(type))
return true;
if (isRMIIDLValueType(type))
return true;
return false;
}
public static boolean isRMIIDLRemoteInterface(Class type) {
if (!java.rmi.Remote.class.isAssignableFrom(type))
return false;
Iterator methodIterator = Arrays.asList(type.getMethods()).iterator();
while (methodIterator.hasNext()) {
Method m = (Method)methodIterator.next();
if (!throwsRemoteException(m)) {
return false;
}
Iterator it = Arrays.asList(m.getExceptionTypes()).iterator();
while (it.hasNext()) {
Class exception = (Class)it.next();
if (!isRMIIDLExceptionType(exception))
return false;
}
}
Iterator fieldIterator = Arrays.asList(type.getFields()).iterator();
while (fieldIterator.hasNext()) {
Field f = (Field)fieldIterator.next();
if (f.getType().isPrimitive())
continue;
if (f.getType().equals(java.lang.String.class))
continue;
return false;
}
return true;
}
public static boolean isAbstractInterface(Class type) {
if (!type.isInterface())
return false;
if (org.omg.CORBA.Object.class.isAssignableFrom(type))
return false;
if (java.rmi.Remote.class.isAssignableFrom(type))
return false;
Iterator methodIterator = Arrays.asList(type.getMethods()).iterator();
while (methodIterator.hasNext()) {
Method m = (Method)methodIterator.next();
if (!throwsRemoteException(m)) {
return false;
}
}
return true;
}
public static boolean isRMIIDLExceptionType(Class type) {
if (!Throwable.class.isAssignableFrom(type))
return false;
if (Error.class.isAssignableFrom(type))
return false;
if (RuntimeException.class.isAssignableFrom(type))
return false;
if (!isRMIIDLValueType(type))
return false;
return true;
}
public static boolean isRMIIDLValueType(Class type) {
if (java.rmi.Remote.class.isAssignableFrom(type))
return false;
if (org.omg.CORBA.Object.class.isAssignableFrom(type))
return false;
if (type.getDeclaringClass() != null && isStatic(type))
if (!isRMIIDLValueType(type.getDeclaringClass()))
return false;
return true;
}
public static boolean isAbstractValueType(Class type) {
if (!type.isInterface())
return false;
if (org.omg.CORBA.Object.class.isAssignableFrom(type))
return false;
boolean cannotBeRemote = false;
boolean cannotBeAbstractInterface = false;
if (java.rmi.Remote.class.isAssignableFrom(type)) {
cannotBeAbstractInterface = true;
}
else {
cannotBeRemote = true;
}
Iterator methodIterator = Arrays.asList(type.getMethods()).iterator();
while (methodIterator.hasNext()) {
Method m = (Method)methodIterator.next();
if (!throwsRemoteException(m)) {
cannotBeAbstractInterface = true;
cannotBeRemote = true;
break;
}
Iterator it = Arrays.asList(m.getExceptionTypes()).iterator();
while (it.hasNext()) {
Class exception = (Class)it.next();
if (!isRMIIDLExceptionType(exception)) {
cannotBeRemote = true;
break;
}
}
}
if (!cannotBeRemote) {
Iterator fieldIterator = Arrays.asList(type.getFields()).iterator();
while (fieldIterator.hasNext()) {
Field f = (Field)fieldIterator.next();
if (f.getType().isPrimitive())
continue;
if (f.getType().equals(java.lang.String.class))
continue;
cannotBeRemote = true;
break;
}
}
return cannotBeRemote && cannotBeAbstractInterface;
}
public static void rethrowIfCorbaSystemException(Exception e)
{
if (e instanceof java.rmi.MarshalException)
throw new org.omg.CORBA.MARSHAL(e.toString());
else if (e instanceof java.rmi.NoSuchObjectException)
throw new org.omg.CORBA.OBJECT_NOT_EXIST(e.toString());
else if (e instanceof java.rmi.AccessException)
throw new org.omg.CORBA.NO_PERMISSION(e.toString());
else if (e instanceof javax.transaction.TransactionRequiredException)
throw new org.omg.CORBA.TRANSACTION_REQUIRED(e.toString());
else if (e instanceof javax.transaction.TransactionRolledbackException)
throw new org.omg.CORBA.TRANSACTION_ROLLEDBACK(e.toString());
else if (e instanceof javax.transaction.InvalidTransactionException)
throw new org.omg.CORBA.INVALID_TRANSACTION(e.toString());
}
}