<?php
/************************************************************************************************
* Copyright (c) 2009, Robert Schmitz
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * The names of its contributors may not be used to endorse or promote
* products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************************************/
require_once 'AnnotationParser.class.php';
abstract class DocAnnotation {
private static $cache = array();
/**
*
* @param $string
* @return unknown_type
*/
public static function getAnnotationsFromString($string) {
$p = new AnnotationParser();
$p->parse($string);
return $p->annotations;
}
private static function extractSections($string) {
$found = array();
while (preg_match('/<!---([[:print:][:space:]]*?)-->/', $string, $matches)) {
$found[] = $matches[1];
$string = substr($string, strpos($string, $matches[0]) + strlen($matches[0]));
}
return (count($found) == 0) ? $string : implode(" ", $found);
}
/**
*
* @param $obj
* @param $prop
* @return unknown_type
*/
public static function getPropertyAnnotations($obj, $prop) {
if (trim($prop) == '')
throw new InvalidArgumentException('Property name must not be empty.');
$key = 'prop_'.get_class($obj).'_'.$prop;
if (!isset(self::$cache[$key])) {
$refl = new ReflectionProperty($obj, $prop);
self::$cache[$key] = self::getAnnotationsFromString(self::extractSections($refl->getDocComment()));
}
return self::$cache[$key];
}
/**
*
* @param $obj
* @param $method
* @return unknown_type
*/
public static function getMethodAnnotations($obj, $method) {
if (trim($method) == '')
throw new InvalidArgumentException('Method name must not be empty.');
$key = 'methd_'.get_class($obj).'_'.$method;
if (!isset(self::$cache[$key])) {
$refl = new ReflectionMethod($obj, $method);
self::$cache[$key] = self::getAnnotationsFromString(self::extractSections($refl->getDocComment()));
}
return self::$cache[$key];
}
/**
*
* @param $class
* @return unknown_type
*/
public static function getClassAnnotations($obj) {
$class = get_class($obj);
if (trim($class) == '')
throw new InvalidArgumentException('Class name must not be empty.');
$key = 'class_'.$class;
if (!isset(self::$cache[$key])) {
$refl = new ReflectionClass($obj);
self::$cache[$key] = self::getAnnotationsFromString(self::extractSections($refl->getDocComment()));
}
return self::$cache[$key];
}
/**
*
* @param $class
* @param $annotation
* @return unknown_type
*/
public static function getClassAnnotation($class, $annotation) {
$annots = self::getClassAnnotations($class);
return $annots[strtolower($annotation)];
}
/**
*
* @param $obj
* @param $method
* @param $annotation
* @return unknown_type
*/
public static function getMethodAnnotation($obj, $method, $annotation) {
$annots = self::getMethodAnnotations($obj, $method);
return $annots[strtolower($annotation)];
}
/**
*
* @param $obj
* @param $prop
* @param $annotation
* @return unknown_type
*/
public static function getPropertyAnnotation($obj, $prop, $annotation) {
$annots = self::getPropertyAnnotations($obj, $prop);
return $annots[strtolower($annotation)];
}
/**
*
* @param $class
* @return boolean
*/
public static function hasClassAnnotations($class) {
try {
return count(self::getClassAnnotations($class)) > 0;
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $obj
* @param $method
* @return boolean
*/
public static function hasMethodAnnotations($obj, $method) {
try {
return count(self::getMethodAnnotations($obj, $method)) > 0;
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $obj
* @param $prop
* @return boolean
*/
public static function hasPropertyAnnotations($obj, $prop) {
try {
return count(self::getPropertyAnnotations($obj, $prop)) > 0;
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $class
* @param $annotation
* @return boolean
*/
public static function hasClassAnnotation($class, $annotation) {
try {
$annots = self::getClassAnnotations($class);
return isset($annots[strtolower($annotation)]);
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $obj
* @param $method
* @param $annotation
* @return boolean
*/
public static function hasMethodAnnotation($obj, $method, $annotation) {
try {
$annots = self::getMethodAnnotations($obj, $method);
return isset($annots[strtolower($annotation)]);
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $obj
* @param $prop
* @param $annotation
* @return boolean
*/
public static function hasPropertyAnnotation($obj, $prop, $annotation) {
try {
$annots = self::getPropertyAnnotations($obj, $prop);
return isset($annots[strtolower($annotation)]);
} catch(ParsingException $e) {
return false;
}
}
}
?>