--- a/Entity/DocumentRepository.php Thu Oct 27 05:51:04 2011 +0200
+++ b/Entity/DocumentRepository.php Thu Oct 27 21:21:11 2011 +0200
@@ -3,7 +3,9 @@
namespace IRI\Bundle\WikiTagBundle\Entity;
use Doctrine\ORM\EntityRepository;
-use IRI\Bundle\WikiTagBundle\Model\DocumentInterface;
+use IRI\Bundle\WikiTagBundle\Entity\Document;
+
+use \ReflectionClass;
/**
* DocumentRepository
@@ -13,23 +15,158 @@
*/
class DocumentRepository extends EntityRepository
{
+ /**
+ *
+ * TODO : Enter description here ...
+ * @var ReflectionClass
+ */
+ private $reflection_class;
+ private $reflection_doc_class;
+ private $set_methods = array();
+ private $get_methods = array();
+
function findOneByExternalId($external_id)
{
- return $this->findOneBy(array("externalId" => strval($external_id)));
+ return $this->findOneBy(array("externalId" => $external_id));
+ }
+
+ private function reflectionSetField($object, $method_name, $value)
+ {
+ if(isset($this->set_methods[$method_name]))
+ {
+ $set_method = $this->set_methods[$method_name];
+ }
+
+ if(!isset($set_method) || is_null($set_method))
+ {
+ if(is_null($this->reflection_doc_class))
+ {
+ $this->reflection_doc_class = new ReflectionClass(get_class($object));
+ }
+
+ $set_method = NULL;
+ if($this->reflection_doc_class->hasMethod($method_name))
+ {
+ $set_method = $this->reflection_doc_class->getMethod($method_name);
+ }
+ if(!is_null($set_method))
+ {
+ $this->set_methods[$method_name]=$set_method;
+ }
+ }
+
+ if(!isset($set_method) || is_null($set_method) || !$set_method->isPublic())
+ {
+ throw new \Exception("setter method unknown $method_name");
+ }
+
+ //set value
+ $set_method->invoke($object, $value);
+
}
- function writeDocument(DocumentInterface $document)
+ private function reflectionGetField($document, $accessor)
+ {
+
+ if(!isset($this->get_methods[$accessor]) || is_null($this->get_methods[$accessor]))
+ {
+ if(is_null($this->reflection_class))
+ {
+ $this->reflection_class = new \ReflectionClass(get_class($document));
+ }
+
+ //look at properties
+ if($this->reflection_class->hasProperty($accessor))
+ {
+ $get_object = $this->reflection_class->getProperty($accessor);
+ if(!$get_object->isPublic())
+ {
+ $get_object = NULL;
+ }
+ }
+
+ if((!isset($get_object) || is_null($get_object)) && $this->reflection_class->hasMethod($accessor))
+ {
+ $get_object = $this->reflection_class->getMethod($accessor);
+ if(!$get_object->isPublic())
+ {
+ $get_object = NULL;
+ }
+ }
+
+ if((!isset($get_object) || is_null($get_object)) && $this->reflection_class->hasMethod("get".ucfirst($accessor)))
+ {
+ $get_object = $this->reflection_class->getMethod("get".ucfirst($accessor));
+ if(!$get_object->isPublic())
+ {
+ $get_object = NULL;
+ }
+ }
+
+ if(isset($get_object) && !is_null($get_object))
+ {
+ $this->get_methods[$accessor] = $get_object;
+ }
+ }
+
+ if(isset($this->get_methods[$accessor]))
+ {
+ $get_object = $this->get_methods[$accessor];
+ if(!is_null($get_object))
+ {
+ if(is_a($get_object,"\ReflectionMethod"))
+ {
+ return $get_object->invoke($document);
+ }
+ elseif(is_a($get_object,"\ReflectionProperty"))
+ {
+ return $get_object->getValue($document);
+ }
+ else
+ {
+ //TODO : custom exception
+ throw new \Exception("Bad reflection object type");
+ }
+ }
+ }
+
+ //TODO: replace by custom exception
+ throw new \Exception("Unknown accessor $accessor");
+ }
+
+ function writeDocument($document, $document_id_column, $fields)
{
# get document from id
- $baseDocument = $this->findOneByExternalId($document->getId());
+ $docid = $this->reflectionGetField($document, $document_id_column);
+ $baseDocument = $this->findOneByExternalId($docid);
if(is_null($baseDocument))
{
$baseDocument = new Document();
- $baseDocument->setExternalId(strval($document->getId()));
+ $baseDocument->setExternalId($docid);
}
- $baseDocument->setDescription($document->getDescription());
- $baseDocument->setTitle($document->getTitle());
+
+ foreach ($fields as $name => $field_def) {
+ if(isset($field_def['accessor']))
+ {
+ $accessor = $field_def['accessor'];
+ }
+ else
+ {
+ $accessor = NULL;
+ }
+ if(is_null($accessor))
+ {
+ $accessor = $name;
+ }
+
+ $value = strval($this->reflectionGetField($document,$accessor));
+
+ $method_name = "set".ucfirst($name);
+
+ $this->reflectionSetField($baseDocument, $method_name, $value);
+
+ }
$this->getEntityManager()->persist($baseDocument);
$this->getEntityManager()->flush();
@@ -37,9 +174,10 @@
}
- function removeDocument(DocumentInterface $document)
+ function removeDocument($document, $document_id_column)
{
- $baseDocument = $this->findOneByExternalId($document->getId());
+ $docid = $this->reflectionGetField($document, $document_id_column);
+ $baseDocument = $this->findOneByExternalId($docid);
if(!is_null($baseDocument))
{
$this->getEntityManager()->remove($baseDocument);