1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
<?php
/**
* TSqlMapXmlConfigBuilder, TSqlMapXmlConfiguration, TSqlMapXmlMappingConfiguration classes file.
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @link http://www.pradosoft.com/
* @copyright Copyright © 2005-2014 PradoSoft
* @license http://www.pradosoft.com/license/
* @package Prado\Data\SqlMap\Configuration
*/
namespace Prado\Data\SqlMap\Configuration;
use Prado\Data\SqlMap\DataMapper\TSqlMapConfigurationException;
use Prado\Prado;
/**
* TSqlMapXmlConfig class file.
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @package Prado\Data\SqlMap\Configuration
*/
abstract class TSqlMapXmlConfigBuilder
{
/**
* Create an instance of an object give by the attribute named 'class' in the
* node and set the properties on the object given by attribute names and values.
* @param SimpleXmlNode property node
* @return Object new instance of class with class name given by 'class' attribute value.
*/
protected function createObjectFromNode($node)
{
if(isset($node['class']))
{
$obj = Prado::createComponent((string)$node['class']);
$this->setObjectPropFromNode($obj,$node,array('class'));
return $obj;
}
throw new TSqlMapConfigurationException(
'sqlmap_node_class_undef', $node, $this->getConfigFile());
}
/**
* For each attributes (excluding attribute named in $except) set the
* property of the $obj given by the name of the attribute with the value
* of the attribute.
* @param Object object instance
* @param SimpleXmlNode property node
* @param array exception property name
*/
protected function setObjectPropFromNode($obj,$node,$except=array())
{
foreach($node->attributes() as $name=>$value)
{
if(!in_array($name,$except))
{
if($obj->canSetProperty($name))
$obj->{$name} = (string)$value;
else
throw new TSqlMapConfigurationException(
'sqlmap_invalid_property', $name, get_class($obj),
$node, $this->getConfigFile());
}
}
}
/**
* Gets the filename relative to the basefile.
* @param string base filename
* @param string relative filename
* @return string absolute filename.
*/
protected function getAbsoluteFilePath($basefile,$resource)
{
$basedir = dirname($basefile);
$file = realpath($basedir.DIRECTORY_SEPARATOR.$resource);
if(!is_string($file) || !is_file($file))
$file = realpath($resource);
if(is_string($file) && is_file($file))
return $file;
else
throw new TSqlMapConfigurationException(
'sqlmap_unable_to_find_resource', $resource);
}
/**
* Load document using simple xml.
* @param string filename.
* @return SimpleXmlElement xml document.
*/
protected function loadXmlDocument($filename,TSqlMapXmlConfiguration $config)
{
if( strpos($filename, '${') !== false)
$filename = $config->replaceProperties($filename);
if(!is_file($filename))
throw new TSqlMapConfigurationException(
'sqlmap_unable_to_find_config', $filename);
return simplexml_load_string($config->replaceProperties(file_get_contents($filename)));
}
/**
* Get element node by ID value (try for attribute name ID as case insensitive).
* @param SimpleXmlDocument $document
* @param string tag name.
* @param string id value.
* @return SimpleXmlElement node if found, null otherwise.
*/
protected function getElementByIdValue($document, $tag, $value)
{
//hack to allow upper case and lower case attribute names.
foreach(array('id','ID','Id', 'iD') as $id)
{
$xpath = "//{$tag}[@{$id}='{$value}']";
foreach($document->xpath($xpath) as $node)
return $node;
}
}
/**
* @return string configuration file.
*/
protected abstract function getConfigFile();
}
|