/** * Register transport implementation for a specific scheme * * @param string scheme * @param lang.XPClass<peer.http.HttpTransport> class */ public static function register($scheme, XPClass $class) { if (!$class->isSubclassOf('peer.http.HttpTransport')) { throw new IllegalArgumentException(sprintf('Given argument must be lang.XPClass<peer.http.HttpTransport>, %s given', $class->toString())); } self::$transports[$scheme] = $class; }
/** * Register an implementation * * @param string algorithm * @param lang.XPClass<security.checksum.MessageDigestImpl> class * @throws lang.IllegalArgumentException */ public static function register($algorithm, XPClass $impl) { if (!$impl->isSubclassOf('security.checksum.MessageDigestImpl')) { throw new IllegalArgumentException('Implementation class must be a security.checksum.MessageDigestImpl'); } self::$implementations[$algorithm] = $impl; }
/** * Register an algorithm * * @param string name * @param lang.XPClass<security.password.Algorithm> impl * @throws lang.IllegalArgumentException in case the given class is not an Algorithm */ public static function setAlgorithm($name, XPClass $impl) { if (!$impl->isSubclassOf('security.password.Algorithm')) { throw new IllegalArgumentException('Given argument is not an Algorithm class (' . xp::stringOf($impl) . ')'); } self::$algorithms[$name] = $impl; }
/** * Get all test cases * * @param lang.XPClass class * @param var[] arguments * @return unittest.TestCase[] */ public function testCasesInClass(XPClass $class, $arguments = NULL) { // Verify we were actually given a testcase class if (!$class->isSubclassOf('unittest.TestCase')) { throw new IllegalArgumentException('Given argument is not a TestCase class (' . xp::stringOf($class) . ')'); } // Add all tests cases $r = array(); foreach ($class->getMethods() as $m) { $m->hasAnnotation('test') && ($r[] = $class->getConstructor()->newInstance(array_merge((array) $m->getName(TRUE), (array) $arguments))); } // Verify we actually added tests by doing this. if (empty($r)) { throw new NoSuchElementException('No tests found in ' . $class->getName()); } return $r; }
/** * Register a driver * * Usage: * <code> * DriverManager::register('mydb', XPClass::forName('my.db.Connection')); * // [...] * $conn= DriverManager::getConnection('mydb://...'); * </code> * * @param string name identifier * @param lang.XPClass<rdbms.DBConnection> class * @throws lang.IllegalArgumentException in case an incorrect class is given */ public static function register($name, XPClass $class) { if (!$class->isSubclassOf('rdbms.DBConnection')) { throw new IllegalArgumentException(sprintf('Given argument must be lang.XPClass<rdbms.DBConnection>, %s given', $class->toString())); } self::$instance->drivers[$name] = $class; self::$instance->lookup = array(); }
/** * Returns the enumeration members for a given class * * @param lang.XPClass class class object * @return self[] * @throws lang.IllegalArgumentException in case the given class is not an enum */ public static function valuesOf(XPClass $class) { if (!$class->isEnum()) { throw new IllegalArgumentException('Argument class must be lang.XPClass<? extends lang.Enum>'); } $r = []; if ($class->isSubclassOf(self::class)) { foreach ($class->reflect()->getStaticProperties() as $prop) { $class->isInstance($prop) && ($r[] = $prop); } } else { $t = ClassLoader::defineClass($class->getName() . 'Enum', self::class, []); foreach ($class->reflect()->getMethod('getValues')->invoke(null) as $name => $ordinal) { $r[] = $t->newInstance($ordinal, $name); } } return $r; }