82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\ldap\schemas;
 | |
| 
 | |
| use nur\A;
 | |
| use nur\func;
 | |
| use nur\ldap\LdapAttr;
 | |
| use nur\ldap\LdapConn;
 | |
| use nur\ldap\syntaxes\AbstractSyntax;
 | |
| use nur\ldap\syntaxes\CompositeSyntax;
 | |
| use nur\php\Autogen;
 | |
| 
 | |
| class SchemaManager {
 | |
|   function __construct(LdapConn $conn, ?array $overrides=null) {
 | |
|     $lse = new LdapSchemaExtractor($conn->getSchemaInfos());
 | |
|     $lse->init();
 | |
|     $this->lse = $lse;
 | |
|     $this->overrides = $overrides;
 | |
|   }
 | |
| 
 | |
|   /** @var LdapSchemaExtractor */
 | |
|   protected $lse;
 | |
| 
 | |
|   /** @var array|null */
 | |
|   protected $overrides;
 | |
| 
 | |
|   function getAttributes(array $objectClasses): array {
 | |
|     return $this->lse->getAttributes($objectClasses, $this->overrides);
 | |
|   }
 | |
| 
 | |
|   /** @var AbstractSyntax[] */
 | |
|   protected $syntaxes;
 | |
| 
 | |
|   function getSyntax($class): AbstractSyntax {
 | |
|     if (is_array($class)) return func::cons(...$class);
 | |
|     $syntax = A::get($this->syntaxes, $class);
 | |
|     if ($syntax === null) {
 | |
|       $syntax = $this->syntaxes[$class] = func::cons($class);
 | |
|     }
 | |
|     return $syntax;
 | |
|   }
 | |
| 
 | |
|   function autogenSchema(array $objectClasses): array {
 | |
|     return $this->getAttributes($objectClasses);
 | |
|   }
 | |
| 
 | |
|   static function fix_type(AbstractSyntax $syntax, bool $monovalued): array {
 | |
|     if ($syntax instanceof CompositeSyntax) {
 | |
|       if ($monovalued) $phpType = $syntax->getPhpType();
 | |
|       else $phpType = $syntax->getAttrClass();
 | |
|     } else {
 | |
|       $phpType = $syntax->getPhpType();
 | |
|       if (!$monovalued) $phpType .= "[]";
 | |
|     }
 | |
|     return Autogen::fix_type($phpType);
 | |
|   }
 | |
| 
 | |
|   function autogenProperties(array $schema): array {
 | |
|     $properties = [];
 | |
|     foreach ($schema as $attribute) {
 | |
|       $name = $attribute["name"];
 | |
|       /** @var AbstractSyntax $syntax */
 | |
|       $syntax = $this->getSyntax($attribute["class"]);
 | |
|       $monovalued = ($attribute["flags"] & LdapAttr::MONOVALUED) != 0;
 | |
|       [$phpType, $returnType] = self::fix_type($syntax, $monovalued);
 | |
|       $properties[] = "$returnType \$$name";
 | |
|     }
 | |
|     return $properties;
 | |
|   }
 | |
| 
 | |
|   function autogenMethods(array $schema): array {
 | |
|     $methods = [];
 | |
|     foreach ($schema as $attribute) {
 | |
|       $name = $attribute["name"];
 | |
|       /** @var AbstractSyntax $syntax */
 | |
|       $syntax = $this->getSyntax($attribute["class"]);
 | |
|       $returnType = $syntax instanceof CompositeSyntax? $syntax->getAttrClass(): LdapAttr::class;
 | |
|       $methods[] = "\\$returnType $name()";
 | |
|     }
 | |
|     return $methods;
 | |
|   }
 | |
| }
 |