Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php// $Id: EbatNs_LegacyMapper.php,v 1.2 2008-05-02 15:04:05 carsten Exp $// $Log: EbatNs_LegacyMapper.php,v $// Revision 1.2 2008-05-02 15:04:05 carsten// Initial, PHP5/////*- Only assignments are allowed (=)- Local vars are enclosed in []- Any expression might start with / to access the destination object-local var [last] is set to $dest->SalesTaxif SalesTax does not exist it will be created with the given type.[last]=/SalesTax|new:CategoryTypelocal var [last] is set to $dest->SalesTaxif SalesTax does not exist [last] will be null and operation willreturn.[last]=/SalesTax|existThe element of local object is assigned a literal constant (e.g. $last->Element = 'Const')[last]/Element = Const | "My Value"The same, but the local object is assumed as a XsdType with an attribute[last]/@Attribute=Const$dest->SalesTax is set to the reference of local var [last]/SalesTax=[last]$dest->SalesTax[] is set to the reference of local var [last]/()SalesTax=[last]$dest->SalesTax[index] is set. index will be calculated by the data with index 0 (or $data['myvar']/({0})SalesTax=[last]/({myvar})SalesTax=[last]*//*** EbatNs_MapExpression** @package EbatNs* @author Carsten Harnisch* @copyright Copyright (c) 2005, IntradeSys Limited* @version $Id: EbatNs_LegacyMapper.php,v 1.2 2008-05-02 15:04:05 carsten Exp $* @access public*/class EbatNs_MapExpression{protected $_expression;protected $_mapper;/*** EbatNs_MapExpression::EbatNs_MapExpression()** @param mixed $mapper* @param mixed $expression* @return*/function EbatNs_MapExpression(&$mapper, $expression){$this->_mapper = &$mapper;$this->_expression = $expression;}/*** EbatNs_MapExpression::evalExpression()** @return*/function &evalExpression(){// echo "evalExpression " . $this->_expression . "<br>";if ($this->_expression[0] == "["){if (strstr($this->_expression, '/') !== false){// an expression like [xxx]/element// or [xxx]/element|*typelist($localname, $element) = explode('/', $this->_expression);$localname = trim($localname, "[]");$t = &$this->_mapper->_getLocal($localname);if (!$t){// we could not the local var// so this is an error !return null;}$pieces = explode("|", $element);$creationType = null;if (count($pieces) == 1){$memberName = $pieces[0];$typename = null;}else{$memberName = $pieces[0];$creationType = $pieces[1];if ($creationType[0] == '*')$typename = substr($creationType, 1);else$typename = 'stdClass';}// echo "memberName $memberName <br>";// is this an index access ?if ($memberName[0] == "("){$isIndexAccess = true;$accessIndex = $this->_parseIndex($memberName);// echo "indexAccess $memberName [ $accessIndex ] ($typename) <br>";// print_r($t);// die("STOP");if ($accessIndex){// die("STOP");if (isset($t->{$memberName}[$accessIndex]))$target = $target = &$t->{$memberName}[$accessIndex];else{// echo "indexAccess NOT THERE $memberName [ $accessIndex ] ($typename)<br>";// die("STOP");$target = null;}}else{// echo "indexAccess generic() $memberName [ $accessIndex ] <br>";// an generic index will create an new entry anyway$target = null;}}else{$isIndexAccess = false;$target = &$t->{$memberName} ;}if (!$target && $typename){$this->_mapper->includeType($typename);if ($isIndexAccess){$t->{$memberName}[$accessIndex] = &new $typename;$target = &$t->{$memberName}[$accessIndex];// echo "indexAccess CREATED new $typename $memberName [ $accessIndex ] as <br>";// print_r($t);// die("STOP");// echo "<hr>";}else{$t->{$memberName} = &new $typename;$target = &$t->{$memberName} ;}}return $target;// echo "Eval Return : <br>";// print_r($t);// echo "<hr>";}else{// plain local object like [xxx]$localname = trim($this->_expression, "[]");$t = $this->_mapper->_getLocal($localname);if ($this->_expression == "[sd]"){// echo "Eval Return : <br>";// print_r($t);// echo "<hr>";}return $t;}} elseif ($this->_expression[0] == "{"){$datakey = trim($this->_expression, "{}");$t = &$this->_mapper->getData($datakey);// echo "Eval Return : <br>";// print_r($t);// echo "<hr>";return $t;} elseif ($this->_expression[0] == "/"){$pieces = explode("|", substr($this->_expression, 1));$creationType = null;if (count($pieces) == 1)$creationType = $pieces[0];else{$targetName = $pieces[0];$t = &$this->_mapper->getTarget($targetName);if (!$t){$creationType = $pieces[1];}}if ($creationType[0] == '*'){$typename = substr($creationType, 1);$this->_mapper->includeType($typename);$t = &new $typename;}return $t;}else{// echo "Return Plain<br>";return $this->_expression;}echo "ERROR";}/*** EbatNs_MapExpression::_parseIndex()** @param mixed $name* @return*/function _parseIndex(&$name){list($tmpIndex, $name) = explode(")", $name);$tmpIndex = trim($tmpIndex, "(");if ($tmpIndex == "")return null;else{if ($tmpIndex[0] == "{"){$tmpIndex = trim($tmpIndex, "{}");$tmpIndex = $this->_mapper->getData($tmpIndex);}return $tmpIndex;}}}/*** EbatNs_MapTarget** @package EbatNs* @author Carsten Harnisch* @copyright Copyright (c) 2005, IntradeSys Limited* @version $Id: EbatNs_LegacyMapper.php,v 1.2 2008-05-02 15:04:05 carsten Exp $* @access public*/class EbatNs_MapTarget{protected $_mapper;protected $_targetObject;protected $_targetName;protected $_targetIsArray;protected $_targetIndex;protected $_targetIsLocal;protected $_localName;/*** EbatNs_MapTarget::EbatNs_MapTarget()** @param mixed $mapper* @param mixed $target* @return*/function EbatNs_MapTarget(&$mapper, $target){$this->_mapper = &$mapper;$this->parse($target);}/*** EbatNs_MapTarget::setTarget()** @param mixed $value* @return*/function setTarget(&$value){// echo "setTarget <br>";// print_r($this);if ($this->_targetIsLocal){// echo "setTarget local $this->_localName $this->_targetName is_array: $this->_targetIsArray index: $this->_targetIndex<br>";if (!$this->_targetName){// echo "setTarget <br>";$mapper = &$this->_mapper;$mapper->_setLocal($this->_localName, $value);}else{$mapper = &$this->_mapper;// print_r($this->_mapper);$this->_targetObject = &$mapper->_getLocal($this->_localName);$targetObject = &$this->_targetObject;// echo "TargetObject <br>";// print_r($targetObject);if ($this->_targetIsArray){if ($this->_targetIndex)$targetObject->{$this->_targetName}[$this->_targetIndex] = &$value;else$targetObject->{$this->_targetName}[] = &$value;}else{if ($this->_targetName[0] == "@"){$targetObject->_attributeValues[substr($this->_targetName, 1)] = $value;// print_r($targetObject);// die("123");}else{// echo "$this->_targetName <br>";$targetObject->{$this->_targetName} = &$value;}}$mapper->_setLocal($this->_localName, $targetObject);}}else{$mapper = &$this->_mapper;// echo "Before mapper->_setTarget <br>";// print_r($mapper->_destObject);$mapper->_setTarget($this->_targetName, $value, $this->_targetIsArray, $this->_targetIndex);}return true;}/*** EbatNs_MapTarget::_parseIndex()** @param mixed $name* @return*/function _parseIndex(&$name){list($tmpIndex, $name) = explode(")", $name);$tmpIndex = trim($tmpIndex, "(");if ($tmpIndex == "")return null;else{if ($tmpIndex[0] == "{"){$tmpIndex = trim($tmpIndex, "{}");$tmpIndex = $this->_mapper->getData($tmpIndex);}return $tmpIndex;}}/*** EbatNs_MapTarget::parse()** @param mixed $target* @return*/function parse($target){$this->_targetName = $target;if ($target[0] == '/'){$this->_targetIsLocal = false;list($dummy, $this->_targetName) = explode("/", $target);if ($this->_targetName[0] == "("){$this->_targetIsArray = true;$this->_targetIndex = $this->_parseIndex($this->_targetName);}else{$this->_targetIsArray = false;$this->_targetIndex = null;}// echo "Target is destination : $target $this->_targetName IsArray: $this->_targetIsArray Index: $this->_targetIndex<br>";}else{$this->_targetIsLocal = true;list($dummy, $this->_targetName) = explode("/", $target);if ($this->_targetName[0] == "("){$this->_targetIsArray = true;$this->_targetIndex = $this->_parseIndex($this->_targetName);$this->_targetName = trim($this->_targetName, "()");}else{$this->_targetIsArray = false;$this->_targetIndex = null;}list($targetName, $dummy) = explode("/", $target);$this->_localName = trim($targetName, "[]");// echo "Target is local $this->_localName $this->_targetName IsArray: $this->_targetIsArray Index: $this->_targetIndex<br>";}// echo "need Parse target " . $target . "<br>";}}/*** EbatNs_MapMapping** @package easylister* @author michael* @copyright Copyright (c) 2005* @version $Id: EbatNs_LegacyMapper.php,v 1.2 2008-05-02 15:04:05 carsten Exp $* @access public*/class EbatNs_MapMapping{protected $_EbatNs_MapTarget;protected $_EbatNs_MapExpression;protected $_mapper;/*** EbatNs_MapMapping::EbatNs_MapMapping()** @param mixed $mapper* @param mixed $mapping* @return*/function __construct($mapper, $mapping){$this->_valueMap = $valueMap;$this->_mapper = &$mapper;$this->parse($mapping);}/*** EbatNs_MapMapping::map()** @return*/function map(){$this->_EbatNs_MapTarget->setTarget($this->_EbatNs_MapExpression->evalExpression());return true;}/*** EbatNs_MapMapping::parse()** @param mixed $mapping* @return*/function parse($mapping){// empty or comment lineif ($mapping == '' || $mapping[0] == ';')return;list($target, $expression) = explode('=', $mapping);$mapper = $this->_mapper;$this->_EbatNs_MapExpression = new EbatNs_MapExpression($mapper, $expression);$this->_EbatNs_MapTarget = new EbatNs_MapTarget($mapper, $target);}}/*** EbatNs_LegacyMapper** @package easylister* @author michael* @copyright Copyright (c) 2005* @version $Id: EbatNs_LegacyMapper.php,v 1.2 2008-05-02 15:04:05 carsten Exp $* @access public*/class EbatNs_LegacyMapper{protected $_mappings;protected $_src;protected $_data;protected $_destObject;protected $_locals = null;protected $_valueMap;protected $_isValid = false;/*** EbatNs_LegacyMapper::EbatNs_LegacyMapper()** @param mixed $mapping* @param mixed $destObject* @param mixed $data* @param mixed $valueMapString* @param mixed $defaultData* @return*/function __construct($mapping, $destObject, $data, $valueMapString, $defaultData = null){$this->_destObject = $destObject;if (is_array($data))$this->_data = $data;else$this->_data[] = $data;if ($defaultData)$this->setDefaults($defaultData);if ($valueMapString)$this->parseValueMap($valueMapString);$this->_isValid = $this->Parse($mapping);}/*** EbatNs_LegacyMapper::parseValueMap()** @param mixed $valueMapString* @return*/function parseValueMap($valueMapString){$this->_valueMap = null;$parts = explode("|", $valueMapString);foreach ($parts as $part){list($key, $value) = explode("=", $part);$this->_valueMap[$key] = $value;}}/*** EbatNs_LegacyMapper::Parse()** @param mixed $mapping* @return*/function Parse($mapping){$mapping = str_replace("\r\n", "\n", $mapping);$lines = explode("\n", $mapping);$this->_mappings = null;$thisObject = &$this;foreach ($lines as $line){if ($line == '' || $line[0] == ';')continue;if (trim($line)){$aMapLine = new EbatNs_MapMapping($thisObject, $line);$this->_mappings[] = $aMapLine;}}return count($this->_mappings);}/*** EbatNs_LegacyMapper::Map()** @return*/function Map(){if (!$this->_isValid)return;foreach($this->_mappings as $mapping){if (!$mapping->map())break;}}/*** EbatNs_LegacyMapper::_setLocal()** @param mixed $key* @param mixed $value* @return*/function _setLocal($key, &$value){$this->_locals[$key] = &$value;}/*** EbatNs_LegacyMapper::_getLocal()** @param mixed $key* @return*/function _getLocal($key){return $this->_locals[$key];}/*** EbatNs_LegacyMapper::_setTarget()** @param mixed $targetName* @param mixed $value* @param mixed $isArray* @param mixed $index* @return*/function _setTarget($targetName, &$value, $isArray = false, $index = null){$dest = &$this->_destObject;if ($isArray){if ($index)$dest->{$targetName}[$index] = $value;else$dest->{$targetName}[] = $value;}else{if ($targetName[0] == "@")$dest->_attributeValues[substr($targetName, 1)] = $value;else$dest->{$targetName} = $value;}}/*** EbatNs_LegacyMapper::getTarget()** @param mixed $name* @param mixed $index* @return*/function &getTarget($name, $index = null){$dest = $this->_destObject;if (isset($dest->{$name})){if ($index)return $dest->{$name}[$index];elsereturn $dest->{$name} ;}elsereturn null;}/*** EbatNs_LegacyMapper::getData()** @param mixed $indexKey* @return*/function getData($indexKey){$pieces = explode(":", $indexKey);if (count($pieces) == 1)return $this->_data[$indexKey];elsereturn $this->_call_data_function($pieces[0], $this->_data[$pieces[1]]);}/*** EbatNs_LegacyMapper::includeType()** @param mixed $typeName* @return*/function includeType($typeName){if (!class_exists($typeName))require_once $typeName . '.php';}/*** EbatNs_LegacyMapper::_call_data_function()** @param mixed $funcName* @param mixed $arg* @return*/function _call_data_function($funcName, $arg){switch ($funcName){case 'utf8_encode':case 'utf8encode':return utf8_encode($arg);case 'legacy-map':case 'mapped-options':return $this->mapValue($arg);case 'bool':case 'boolean':return $this->SoapBoolean($arg);case 'cdata':// return '<![CDATA[' . $arg . ']]>';default:return $arg;}}/*** EbatNs_LegacyMapper::mapValue()** @param mixed $arg* @return*/function mapValue($arg){if (isset($this->_valueMap[$arg]))return $this->_valueMap[$arg];elsereturn $arg;}/*** EbatNs_LegacyMapper::setDefaults()** @param mixed $arrayData* @return*/function setDefaults($arrayData){$this->_data = array_merge($this->_data, $arrayData);}/*** EbatNs_LegacyMapper::SoapBoolean()** @param mixed $value* @return*/function SoapBoolean($value){if (is_numeric($value) || is_bool($value)){if ($value)return 'true';elsereturn 'false';}elsereturn $value;}}?>