src.org.python.modules.posix.Hider Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-standalone Show documentation
Show all versions of jython-standalone Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
/* Copyright (c) Jython Developers */
package org.python.modules.posix;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import org.python.core.PyObject;
/**
* Utility class for hiding PosixModule methods depending on the platform, or whether the
* underlying posix implementation is native.
*/
class Hider {
/**
* Hide module level functions defined in the PosixModule dict not applicable to this
* OS, identified by the PosixModule.Hide annotation.
*
* @param cls the PosixModule class
* @param dict the PosixModule module dict
* @param os the underlying OS
* @param native whether the underlying posix is native
*/
public static void hideFunctions(Class> cls, PyObject dict, OS os, boolean isNative) {
PosixImpl posixImpl = isNative ? PosixImpl.NATIVE : PosixImpl.JAVA;
for (Method method: cls.getDeclaredMethods()) {
if (isHidden(method, os, posixImpl)) {
dict.__setitem__(method.getName(), null);
}
}
}
/**
* Determine if method should be hidden for this OS/PosixImpl.
*/
private static boolean isHidden(Method method, OS os, PosixImpl posixImpl) {
if (method.isAnnotationPresent(Hide.class)) {
Hide hide = method.getAnnotation(Hide.class);
if (hide.posixImpl() != PosixImpl.NOT_APPLICABLE && hide.posixImpl() == posixImpl) {
return true;
}
for (OS hideOS : hide.value()) {
if (os == hideOS) {
return true;
}
}
}
return false;
}
}
/**
* Tags PosixModule methods as hidden on the specified OS or PosixImpl.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Hide {
/** Hide method on these OSes. */
OS[] value() default {};
/**
* @Hide(posixImpl = PosixImpl.JAVA) hides the method from Python when the POSIX
* library isn't native. The default NOT_APPLICABLE means the POSIX implementation
* doesn't matter.
*/
PosixImpl posixImpl() default PosixImpl.NOT_APPLICABLE;
}
/**
* The type of underlying POSIX library implementation (native or not).
*/
enum PosixImpl {NOT_APPLICABLE, NATIVE, JAVA};