Author: Tobias Schlitt
Date: 2007-01-22 17:52:20 +0100 (Mon, 22 Jan 2007)
New Revision: 4542

Log:
- Fixed issue #9999: idProperty missing in definition file causes unclear
  error messages.
# I had to adjust the manager test cases, which did not have an ID property
# defined.

Added:
   trunk/PersistentObject/src/exceptions/definition_missing_id_property.php
   trunk/PersistentObject/tests/data/persistent_test_object_no_id.php
   trunk/PersistentObject/tests/data/persistenttestobjectnoid.php
Modified:
   trunk/PersistentObject/ChangeLog
   trunk/PersistentObject/src/managers/code_manager.php
   trunk/PersistentObject/src/persistent_autoload.php
   trunk/PersistentObject/tests/managers/data/simpledefinition.php
   trunk/PersistentObject/tests/managers/data2/myclass.php
   trunk/PersistentObject/tests/persistent_session_test.php

Modified: trunk/PersistentObject/ChangeLog
===================================================================
--- trunk/PersistentObject/ChangeLog    2007-01-22 11:07:09 UTC (rev 4541)
+++ trunk/PersistentObject/ChangeLog    2007-01-22 16:52:20 UTC (rev 4542)
@@ -1,3 +1,9 @@
+1.3beta1 - [RELEASEDATE]
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+- Fixed issue #9999: idProperty missing in definition file causes unclear
+  error messages.
+
 1.2 - Monday 18 December 2006
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

Added: trunk/PersistentObject/src/exceptions/definition_missing_id_property.php
===================================================================
--- trunk/PersistentObject/src/exceptions/definition_missing_id_property.php    
2007-01-22 11:07:09 UTC (rev 4541)
+++ trunk/PersistentObject/src/exceptions/definition_missing_id_property.php    
2007-01-22 16:52:20 UTC (rev 4542)
@@ -0,0 +1,30 @@
+<?php
+/**
+ * File containing the ezcPersistentDefinitionMissingIdPropertyException class.
+ *
+ * @package PersistentObject
+ * @version //autogen//
+ * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ */
+/**
+ * Exception thrown, if an object of ezcPersistentObjectDefinition has no 
idProperty attribute.
+ *
+ * @package PersistentObject
+ * @version //autogen//
+ */
+class ezcPersistentDefinitionMissingIdPropertyException extends 
ezcPersistentObjectException
+{
+
+    /**
+     * Constructs a new ezcPersistentDefinitionMissingIdPropertyException for 
the class $class.
+     *
+     * @param string $class
+     * @return void
+     */
+    public function __construct( $class )
+    {
+        parent::__construct( "The persistent object definition for the class 
'$class' does not have an 'idProperty' attribute defined." );
+    }
+}
+?>


Property changes on: 
trunk/PersistentObject/src/exceptions/definition_missing_id_property.php
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/PersistentObject/src/managers/code_manager.php
===================================================================
--- trunk/PersistentObject/src/managers/code_manager.php        2007-01-22 
11:07:09 UTC (rev 4541)
+++ trunk/PersistentObject/src/managers/code_manager.php        2007-01-22 
16:52:20 UTC (rev 4542)
@@ -62,6 +62,8 @@
      * Returns the definition of the persistent object with the class $class.
      *
      * @throws ezcPersistentDefinitionNotFoundException if no such definition 
can be found.
+     * @throws ezcPersistentDefinitionMissingIdPropertyException
+     *         if the definition does not have an "idProperty" attribute.
      * @param string $class
      * @return ezcPersistentDefinition
      */
@@ -78,6 +80,10 @@
             throw new ezcPersistentDefinitionNotFoundException( $class,
                                                                 "Searched for 
'" . realpath( dirname( $path ) ) . "/" . basename( $path ) . "'." );
         }
+        if ( isset( $definition->idProperty ) === false )
+        {
+            throw new ezcPersistentDefinitionMissingIdPropertyException( 
$class );
+        }
         $definition = $this->setupReversePropertyDefinition( $definition );
         return $definition;
     }

Modified: trunk/PersistentObject/src/persistent_autoload.php
===================================================================
--- trunk/PersistentObject/src/persistent_autoload.php  2007-01-22 11:07:09 UTC 
(rev 4541)
+++ trunk/PersistentObject/src/persistent_autoload.php  2007-01-22 16:52:20 UTC 
(rev 4542)
@@ -45,5 +45,6 @@
     'ezcPersistentMultiManager'                         => 
'PersistentObject/managers/multi_manager.php',
     'ezcPersistentCodeManager'                          => 
'PersistentObject/managers/code_manager.php',
     'ezcPersistentDefinitionNotFoundException'          => 
'PersistentObject/exceptions/definition_not_found.php',
+    'ezcPersistentDefinitionMissingIdPropertyException' => 
'PersistentObject/exceptions/definition_missing_id_property.php',
 );
 ?>

Added: trunk/PersistentObject/tests/data/persistent_test_object_no_id.php
===================================================================
--- trunk/PersistentObject/tests/data/persistent_test_object_no_id.php  
2007-01-22 11:07:09 UTC (rev 4541)
+++ trunk/PersistentObject/tests/data/persistent_test_object_no_id.php  
2007-01-22 16:52:20 UTC (rev 4542)
@@ -0,0 +1,121 @@
+<?php
+ezcTestRunner::addFileToFilter( __FILE__ );
+
+/**
+CREATE TABLE PO_test
+(
+  id integer unsigned not null auto_increment,
+  type_varchar varchar(20),
+  type_integer integer,
+  type_decimal decimal(10,2),
+  type_text text,
+
+  PRIMARY KEY (id)
+) TYPE=InnoDB;
+
+  type_date date,
+*/
+
+class PersistentTestObjectNoId
+{
+    public $id = null;
+    public $varchar = null;
+    public $integer = null;
+    public $decimal = null;
+    public $text = null;
+
+    /**
+     * Inserts some data to use for testing.
+     */
+    public static function insertCleanData()
+    {
+        $db = ezcDbInstance::get();
+        $db->exec( "insert into PO_test (id, type_varchar, type_integer,
+                    type_decimal, type_text )
+                    VALUES ( 1, 'Sweden', 9006405, 449.96, 'Sweden has nice 
girls!' )" );
+
+        $db->exec( "insert into PO_test (id, type_varchar, type_integer,
+                    type_decimal, type_text )
+                    VALUES (2, 'Norway', 4593041, 385.19, 'Norway has brown 
goat cheese!' )" );
+
+        $db->exec( "insert into PO_test (id, type_varchar, type_integer,
+                    type_decimal, type_text )
+                    VALUES (3, 'Ukraine', 47732079, 603.70, 'Ukraine has a 
long coastline to the black see.' )" );
+
+        $db->exec( "insert into PO_test (id, type_varchar, type_integer,
+                    type_decimal, type_text )
+                    VALUES (4, 'Germany', 82443000, 357.02, 'Home of the 
lederhosen!.' )" );
+    }
+
+    /**
+     * Saves the schema from database to file.
+     *
+     * Use this method if you have changed the definition of the persistent 
object
+     * and need to update the file on disk.
+     */
+    public function saveSchema()
+    {
+        $db = ezcDbInstance::get();
+        $schema = ezcDbSchema::createFromDb( $db );
+        $schema->writeToFile( 'array', dirname( __FILE__ ) . 
'/persistent_test_object.dba' );
+    }
+
+    /**
+     * Loads the schema from file into the database.
+     */
+    public static function setupTable()
+    {
+        $db = ezcDbInstance::get();
+        // Load schema
+        $schema = ezcDbSchema::createFromFile( 'array', dirname( __FILE__ ) . 
'/persistent_test_object.dba' );
+        $schema->writeToDb( $db );
+
+        // create sequence if it is a postgres database
+        if ( $db->getName() == 'pgsql' )
+        {
+            $db->exec( 'CREATE SEQUENCE PO_test_seq START 5' );
+        }
+
+    }
+
+    public static function cleanup()
+    {
+        $db = ezcDbInstance::get();
+        $db->exec( 'DROP TABLE PO_test' );
+        if ( $db->getName() == 'pgsql' )
+        {
+            $db->exec( 'DROP SEQUENCE po_test_seq' );
+        }
+    }
+
+    /*
+    public function saveSqlSchemas()
+    {
+        $db = ezcDbInstance::get();
+        $schema = ezcDbSchema::createFromFile( 'php', dirname( __FILE__ ) . 
'/persistent_test_object.dba' );
+        $schema->writeToFile( dirname( __FILE__ ) . 
'/persistent_test_object-pgsql.sql', 'pgsql-file', 'schema' );
+    }
+    */
+
+    public function setState( array $state )
+    {
+        foreach ( $state as $key => $value )
+        {
+            $this->$key = $value;
+        }
+    }
+
+    public function getState()
+    {
+        $result = array();
+        $result['id'] = $this->id;
+        $result['decimal'] = $this->decimal;
+        $result['varchar'] = $this->varchar;
+        $result['integer'] = $this->integer;
+        $result['text'] = $this->text;
+        $result['no_such_var'] = "bah"; // This is here to make sure it does 
not provoke an error.
+        return $result;
+    }
+}
+
+?>


Property changes on: 
trunk/PersistentObject/tests/data/persistent_test_object_no_id.php
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/PersistentObject/tests/data/persistenttestobjectnoid.php
===================================================================
--- trunk/PersistentObject/tests/data/persistenttestobjectnoid.php      
2007-01-22 11:07:09 UTC (rev 4541)
+++ trunk/PersistentObject/tests/data/persistenttestobjectnoid.php      
2007-01-22 16:52:20 UTC (rev 4542)
@@ -0,0 +1,47 @@
+<?php
+ezcTestRunner::addFileToFilter( __FILE__ );
+
+/*
+ * Holds the definition for PersistentTestObject
+ * This definition is used by the code manager for
+ * various tests in the system.
+ */
+// build definition
+$def = new ezcPersistentObjectDefinition();
+$def->table = "PO_test";
+$def->class = "PersistentTestObjectNoId";
+
+$def->properties['varchar'] = new ezcPersistentObjectProperty;
+$def->properties['varchar']->columnName = 'type_varchar';
+$def->properties['varchar']->propertyName = 'varchar';
+$def->properties['varchar']->propertyType = 
ezcPersistentObjectProperty::PHP_TYPE_STRING;
+$def->properties['varchar']->defaultValue = '';
+$def->properties['varchar']->visibility = 
ezcPersistentObjectProperty::VISIBILITY_PRIVATE;
+$def->properties['varchar']->isRequired = false;
+
+$def->properties['integer'] = new ezcPersistentObjectProperty;
+$def->properties['integer']->columnName = 'type_integer';
+$def->properties['integer']->propertyName = 'integer';
+$def->properties['integer']->propertyType = 
ezcPersistentObjectProperty::PHP_TYPE_INT;
+$def->properties['integer']->defaultValue = 0;
+$def->properties['integer']->visibility = 
ezcPersistentObjectProperty::VISIBILITY_PRIVATE;
+$def->properties['integer']->isRequired = false;
+
+$def->properties['decimal'] = new ezcPersistentObjectProperty;
+$def->properties['decimal']->columnName = 'type_decimal';
+$def->properties['decimal']->propertyName = 'decimal';
+$def->properties['decimal']->propertyType = 
ezcPersistentObjectProperty::PHP_TYPE_FLOAT;;
+$def->properties['decimal']->defaultValue = 0;
+$def->properties['decimal']->visibility = 
ezcPersistentObjectProperty::VISIBILITY_PRIVATE;
+$def->properties['decimal']->isRequired = false;
+
+$def->properties['text'] = new ezcPersistentObjectProperty;
+$def->properties['text']->columnName = 'type_text';
+$def->properties['text']->propertyName = 'text';
+$def->properties['text']->propertyType = 
ezcPersistentObjectProperty::PHP_TYPE_STRING;;
+$def->properties['text']->defaultValue = '';
+$def->properties['text']->visibility = 
ezcPersistentObjectProperty::VISIBILITY_PRIVATE;
+$def->properties['text']->isRequired = false;
+return $def;
+
+?>


Property changes on: 
trunk/PersistentObject/tests/data/persistenttestobjectnoid.php
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/PersistentObject/tests/managers/data/simpledefinition.php
===================================================================
--- trunk/PersistentObject/tests/managers/data/simpledefinition.php     
2007-01-22 11:07:09 UTC (rev 4541)
+++ trunk/PersistentObject/tests/managers/data/simpledefinition.php     
2007-01-22 16:52:20 UTC (rev 4542)
@@ -1,5 +1,7 @@
 <?php
 ezcTestRunner::addFileToFilter( __FILE__ );
 
-return new ezcPersistentObjectDefinition();
+$def = new ezcPersistentObjectDefinition();
+$def->idProperty = new ezcPersistentObjectIdProperty;
+return $def;
 ?>

Modified: trunk/PersistentObject/tests/managers/data2/myclass.php
===================================================================
--- trunk/PersistentObject/tests/managers/data2/myclass.php     2007-01-22 
11:07:09 UTC (rev 4541)
+++ trunk/PersistentObject/tests/managers/data2/myclass.php     2007-01-22 
16:52:20 UTC (rev 4542)
@@ -3,5 +3,6 @@
 
 $def = new ezcPersistentObjectDefinition();
 $def->class = 'MyClass';
+$def->idProperty = new ezcPersistentObjectIdProperty;
 return $def;
 ?>

Modified: trunk/PersistentObject/tests/persistent_session_test.php
===================================================================
--- trunk/PersistentObject/tests/persistent_session_test.php    2007-01-22 
11:07:09 UTC (rev 4541)
+++ trunk/PersistentObject/tests/persistent_session_test.php    2007-01-22 
16:52:20 UTC (rev 4542)
@@ -10,6 +10,7 @@
 ezcTestRunner::addFileToFilter( __FILE__ );
 
 require_once "data/persistent_test_object.php";
+require_once "data/persistent_test_object_no_id.php";
 
 /**
  * Tests the code manager.
@@ -237,6 +238,24 @@
         catch ( ezcPersistentObjectException $e ) {}
     }
 
+    public function testMissingIdProperty()
+    {
+        $object = new PersistentTestObjectNoId();
+        $object->varchar = 'Finland';
+        $object->integer = 42;
+        $object->decimal = 1.42;
+        $object->text = "Finland has Nokia!";
+        try
+        {
+            $this->session->save( $object );
+        }
+        catch ( ezcPersistentDefinitionMissingIdPropertyException $e )
+        {
+            return;
+        }
+        $this->fail( "Exception not thrown on missing ID property." );
+    }
+
     // Save or update
 
     public function testSaveOrUpdateSave()

-- 
svn-components mailing list
svn-components@lists.ez.no
http://lists.ez.no/mailman/listinfo/svn-components

Reply via email to