combined view classes and added interface

This commit is contained in:
Steffen Vogel 2010-07-24 13:03:34 +02:00
parent 13456028a1
commit 1f85026c09
15 changed files with 291 additions and 426 deletions

View file

@ -33,19 +33,23 @@ use \Volkszaehler\Model;
*/
class ChannelController extends Controller {
// TODO authentification/indentification
/**
* get channels by filter
*
* @todo authentification/indentification
*/
public function get() {
$dql = 'SELECT c FROM Volkszaehler\Model\Channel c';
if ($this->view->request->getParameter('uuid')) {
if ($uuid = $this->view->request->getParameter('uuid')) {
// TODO add conditions
}
if ($this->view->request->getParameter('ugid')) {
if ($ugid = $this->view->request->getParameter('ugid')) {
// TODO add conditions
}
if ($this->view->request->getParameter('indicator')) {
if ($indicator = $this->view->request->getParameter('indicator')) {
// TODO add conditions
}
@ -53,7 +57,7 @@ class ChannelController extends Controller {
$channels = $q->getResult();
foreach ($channels as $channel) {
$this->view->add($channel);
$this->view->addChannel($channel);
}
}
@ -63,7 +67,7 @@ class ChannelController extends Controller {
* @todo validate input and throw exceptions
*/
public function add() {
$channel = new Model\Channel\Meter($this->view->request->getParameter('indicator'));
$channel = new Model\Channel($this->view->request->getParameter('indicator'));
$channel->setName($this->view->request->getParameter('name'));
$channel->setDescription($this->view->request->getParameter('description'));
@ -74,7 +78,7 @@ class ChannelController extends Controller {
$this->em->persist($channel);
$this->em->flush();
$this->view->add($channel);
$this->view->addChannel($channel);
}
/**
@ -84,7 +88,7 @@ class ChannelController extends Controller {
*/
public function delete() {
$ucid = $this->view->request->getParameter('ucid');
$channel = $this->em->getRepository('Volkszaehler\Model\Channel\Channel')->findOneBy(array('uuid' => $ucid));
$channel = $this->em->getRepository('Volkszaehler\Model\Channel')->findOneBy(array('uuid' => $ucid));
$this->em->remove($channel);
$this->em->flush();

View file

@ -48,7 +48,7 @@ abstract class Controller {
*/
public function run($action) {
if (!method_exists($this, $action)) {
throw new \InvalidArgumentException('\'' . $action . '\' is not a valid controller action');
throw new \Exception('\'' . $action . '\' is not a valid controller action');
}
$this->$action();

View file

@ -50,7 +50,7 @@ class DataController extends Controller {
foreach ($channels as $channel) {
$interpreter = $channel->getInterpreter($this->em);
$this->view->add($channel, $interpreter->getValues($from, $to, $groupBy));
$this->view->addChannel($channel, $interpreter->getValues($from, $to, $groupBy));
}
}

View file

@ -29,29 +29,53 @@ namespace Volkszaehler\Controller;
* @author Steffen Vogel (info@steffenvogel.de)
* @package default
*/
use Volkszaehler\Model;
class GroupController extends Controller {
/**
*
* get groups by filter
*/
public function get() {
// TODO get groups from entitymanager according to API specs
$dql = 'SELECT g FROM Volkszaehler\Model\Group g';
$recursion = $this->view->request->getParameter('recursion');
if ($uuid = $this->view->request->getParameter('uuid')) {
// TODO add conditions
}
if ($ugid = $this->view->request->getParameter('ugid')) {
// TODO add conditions
}
$q = $this->em->createQuery($dql);
$groups = $q->getResult();
foreach ($groups as $group) {
$this->view->addGroup($group);
$this->view->addGroup($group, $recursion);
}
}
/**
*
* add new group as child of a parent group
*/
public function add() {
$group = new Group();
$ugid = $this->view->request->getParameter('ugid');
$parent = $this->em->getRepository('Volkszaehler\Model\Group')->findOneBy(array('uuid' => $ugid));
$group->name = $this->view->request->getParameter('name');
$group->description = $this->view->request->getParameter('description');
if ($parent === FALSE) {
throw new \Exception('every group needs a parent');
}
$group = new Model\Group();
$group->setName($this->view->request->getParameter('name'));
$group->setDescription($this->view->request->getParameter('description'));
$this->em->persist($group);
$parent->addGroup($group);
$this->em->flush();
$this->view->add($group);
@ -61,7 +85,8 @@ class GroupController extends Controller {
* @todo authentification/indentification
*/
public function delete() {
$group = Group::getByUuid($this->view->request->getParameter('ugid'));
$ugid = $this->view->request->getParameter('ugid');
$group = $this->em->getRepository('Volkszaehler\Model\Group')->findOneBy(array('uuid' => $ugid));
$this->em->remove($group);
$this->em->flush();
@ -74,7 +99,7 @@ class GroupController extends Controller {
*/
public function edit() {
}
}
}
?>

View file

@ -75,33 +75,38 @@ class Dispatcher {
$request = new HTTP\Request();
$response = new HTTP\Response();
$format = ($request->getParameter('format')) ? $request->getParameter('format') : 'json'; // default view
$controller = $request->getParameter('controller');
if (!($format = $request->getParameter('format'))) {
$format = 'json'; // default view
}
if (!($controller = $request->getParameter('controller'))) {
throw new \Exception('no controller specified');
}
// initialize entity manager
$this->em = Dispatcher::createEntityManager();
// staring debugging
if (($request->getParameter('debug') && $request->getParameter('debug') > 0) || Util\Configuration::read('debug')) {
// starting debugging
if (($debug = $request->getParameter('debug')) && (int) $debug > 0) {
$this->debug = new Util\Debug($request->getParameter('debug'));
$this->em->getConnection()->getConfiguration()->setSQLLogger($this->debug);
}
// TODO debug controll via configuration file
// initialize view
switch ($format) {
case 'png':
case 'jpeg':
case 'gif':
$this->view = new View\JpGraphView($request, $response, $format);
$this->view = new View\JpGraph($request, $response, $format);
break;
case 'json':
case 'xml':
$controller = 'channel';
case 'csv':
$viewClassName = 'Volkszaehler\View\\' . strtoupper($format) . '\\' . strtoupper($format) . ucfirst($controller) . 'View';
$viewClassName = 'Volkszaehler\View\\' . strtoupper($format);
if (!(Util\ClassLoader::classExists($viewClassName)) || !is_subclass_of($viewClassName, '\Volkszaehler\View\View')) {
throw new \InvalidArgumentException('\'' . $viewClassName . '\' is not a valid View');
throw new \Exception('\'' . $viewClassName . '\' is not a valid View');
}
$this->view = new $viewClassName($request, $response);
@ -114,9 +119,9 @@ class Dispatcher {
}
// initialize controller
$controllerClassName = 'Volkszaehler\Controller\\' . ucfirst(strtolower($request->getParameter('controller'))) . 'Controller';
$controllerClassName = 'Volkszaehler\Controller\\' . ucfirst($request->getParameter('controller')) . 'Controller';
if (!(Util\ClassLoader::classExists($controllerClassName)) || !is_subclass_of($controllerClassName, '\Volkszaehler\Controller\Controller')) {
throw new \InvalidArgumentException('\'' . $controllerClassName . '\' is not a valid controller');
throw new \Exception('\'' . $controllerClassName . '\' is not a valid controller');
}
$this->controller = new $controllerClassName($this->view, $this->em);
}
@ -141,7 +146,7 @@ class Dispatcher {
$this->view->addDebug($this->debug);
}
$this->view->render(); // render view & send http response
$this->view->sendResponse(); // render view & send http response
}
/**

View file

@ -21,10 +21,9 @@
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Volkszaehler\View\CSV;
namespace Volkszaehler\View;
use Volkszaehler\View\HTTP;
use Volkszaehler\View;
use Volkszaehler\Util;
/**
@ -35,11 +34,7 @@ use Volkszaehler\Util;
* @author Steffen Vogel <info@steffenvogel.de>
* @package default
*/
abstract class CSVView extends View\View {
protected $csv = array();
protected $header = array();
protected $footer = array();
class CSV extends View {
protected $delimiter = ';';
protected $enclosure = '"';
@ -49,33 +44,57 @@ abstract class CSVView extends View\View {
public function __construct(HTTP\Request $request, HTTP\Response $response) {
parent::__construct($request, $response);
$this->header[] = 'source: volkszaehler.org';
$this->header[] = 'version: ' . \Volkszaehler\VERSION;
echo 'source: volkszaehler.org' . PHP_EOL;
echo 'version: ' . \Volkszaehler\VERSION . PHP_EOL;
$this->response->setHeader('Content-type', 'text/csv');
$this->response->setHeader('Content-Disposition', 'attachment; filename="data.csv"');
}
public function render() {
foreach ($this->header as $line) {
echo $line . PHP_EOL;
public function addChannel(Model\Channel $channel, array $data = NULL) {
$this->csv = array_merge($this->csv, $data);
}
public function addGroup(Model\Group $group) {
}
public function addDebug(Util\Debug $debug) {
}
protected function renderResponse() {
}
protected function addException(\Exception $e) {
}
public function renderResponse() {
// channel data
foreach ($this->channels as $channel) {
foreach ($channel[1] as $reading) {
$array = array_map(array($this, 'escape'), );
echo implode($this->delimiter, $array) . PHP_EOL;
}
}
echo PHP_EOL;
foreach ($this->csv as $array) {
$array = array_map(array($this, 'escape'), $array);
// debug
echo 'time: ' . $debug->getExecutionTime() . PHP_EOL;
echo 'database: ' . Util\Configuration::read('db.driver') . PHP_EOL;
echo implode($this->delimiter, $array) . PHP_EOL;
foreach ($debug->getMessages() as $message) {
echo 'message: ' . $message['message'] . PHP_EOL; // TODO add more information
}
echo PHP_EOL;
foreach ($this->footer as $line) {
echo $line . PHP_EOL;
foreach ($debug->getQueries() as $query) {
echo 'query: ' . $query['sql'] . PHP_EOL;
echo ' parameters: ' . implode(', ', $query['parameters']) . PHP_EOL;
}
parent::render();
}
protected function escape($value) {
@ -89,24 +108,6 @@ abstract class CSVView extends View\View {
return (string) $value;
}
}
public function addDebug(Util\Debug $debug) {
$this->footer[] = 'time: ' . $debug->getExecutionTime();
$this->footer[] = 'database: ' . Util\Configuration::read('db.driver');
foreach ($debug->getMessages() as $message) {
$this->footer[] = 'message: ' . $message['message']; // TODO add more information
}
foreach ($debug->getQueries() as $query) {
$this->footer[] = 'query: ' . $query['sql'];
$this->footer[] = ' parameters: ' . implode(', ', $query['parameters']);
}
}
public function addException(\Exception $exception) {
echo $exception;
}
}
?>

View file

@ -1,38 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2010, The volkszaehler.org project
* @package default
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
*/
/*
* This file is part of volkzaehler.org
*
* volkzaehler.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* volkzaehler.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Volkszaehler\View\CSV;
/**
* CSV data view
*
* @author Steffen Vogel <info@steffenvogel.de>
* @package default
*/
class CSVDataView extends CSVView {
public function add($obj, $data) {
$this->csv = array_merge($this->csv, $data);
}
}
?>

View file

@ -21,12 +21,11 @@
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Volkszaehler\View\JSON;
namespace Volkszaehler\View;
use Volkszaehler\View\HTTP;
use Volkszaehler\View;
use Volkszaehler\Util;
use Volkszaehler\Model;
/**
* JSON view
@ -36,9 +35,11 @@ use Volkszaehler\Util;
* @package default
* @author Steffen Vogel <info@steffenvogel.de>
*/
abstract class JSONView extends View\View {
class JSON extends View {
protected $json = array();
protected $padding = FALSE;
/**
* constructor
*/
@ -51,16 +52,89 @@ abstract class JSONView extends View\View {
$this->response->setHeader('Content-type', 'application/json');
}
public function render() {
public function setPadding($padding) { $this->padding = $padding; }
public function addChannel(Model\Channel $channel, array &$data = NULL) {
$jsonChannel['uuid'] = (string) $channel->getUuid();
$jsonChannel['indicator'] = $channel->getIndicator();
$jsonChannel['unit'] = $channel->getUnit();
$jsonChannel['name'] = $channel->getName();
$jsonChannel['description'] = $channel->getDescription();
$jsonChannel['resolution'] = (int) $channel->getResolution();
$jsonChannel['cost'] = (float) $channel->getCost();
if (isset($data)) {
$jsonChannel['data'] = array();
foreach ($data as $reading) {
$jsonChannel['data'][] = array($reading['timestamp'], $reading['value'], $reading['count']);
}
}
$this->json['channels'][] = $jsonChannel;
}
public function addGroup(Model\Group $group, $recursive = FALSE) {
$this->json['groups'][] = $this->toJson($group, $recursive);
}
public function addDebug(Util\Debug $debug) {
$this->json['debug'] = array(
'time' => $debug->getExecutionTime(),
'messages' => $debug->getMessages(),
'database' => array(
'driver' => Util\Configuration::read('db.driver'),
'queries' => $debug->getQueries()
)
);
}
protected function addException(\Exception $exception) {
$this->json['exception'] = array(
'type' => get_class($exception),
'message' => $exception->getMessage(),
'code' => $exception->getCode(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exception->getTrace()
);
}
protected function toJson(Model\Group $group, $recursive = FALSE) {
$jsonGroup = array();
$jsonGroup['uuid'] = (string) $group->getUuid();
$jsonGroup['name'] = $group->getName();
$jsonGroup['description'] = $group->getDescription();
$jsonGroup['channels'] = array();
foreach ($group->getChannels() as $channel) {
$jsonGroup['channels'][] = (string) $channel->getUuid();
}
if ($recursive) {
$jsonGroup['children'] = array();
foreach ($group->getSubGroups() as $subGroup) {
$jsonGroup['children'][] = $this->toJson($subGroup); // recursion
}
}
return $jsonGroup;
}
public function renderResponse() {
$json = json_encode($this->json);
if (Util\Debug::isActivated()) {
$json = self::format($json);
}
echo $json;
if ($this->padding) {
$json = $this->padding . '(' . $json . ')';
}
parent::render();
echo $json;
}
protected static function format($json) {
@ -112,28 +186,6 @@ abstract class JSONView extends View\View {
return $formatted;
}
public function addDebug(Util\Debug $debug) {
$this->json['debug'] = array(
'time' => $debug->getExecutionTime(),
'messages' => $debug->getMessages(),
'database' => array(
'driver' => Util\Configuration::read('db.driver'),
'queries' => $debug->getQueries()
)
);
}
public function addException(\Exception $exception) {
$this->json['exception'] = array(
'type' => get_class($exception),
'message' => $exception->getMessage(),
'code' => $exception->getCode(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exception->getTrace()
);
}
}
?>

View file

@ -1,60 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2010, The volkszaehler.org project
* @package default
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
*/
/*
* This file is part of volkzaehler.org
*
* volkzaehler.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* volkzaehler.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Volkszaehler\View\JSON;
/**
* JSON channel view
*
* also used for data
*
* @author Steffen Vogel <info@steffenvogel.de>
* @package default
*/
class JSONChannelView extends JSONView {
public function add(\Volkszaehler\Model\Channel $obj, array $data = NULL) {
$channel['uuid'] = (string) $obj->getUuid();
$channel['indicator'] = $obj->getIndicator();
$channel['unit'] = $obj->getUnit();
$channel['name'] = $obj->getName();
$channel['description'] = $obj->getDescription();
// TODO adapt to new indicator style
if (is_subclass_of($obj, '\Volkszaehler\Model\Channel\Meter')) {
$channel['resolution'] = (int) $obj->getResolution();
$channel['cost'] = (float) $obj->getCost();
}
if (isset($data)) {
$channel['data'] = array();
foreach ($data as $reading) {
$channel['data'][] = array($reading['timestamp'], $reading['value'], $reading['count']);
}
}
$this->json['channels'][] = $channel;
}
}
?>

View file

@ -1,52 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2010, The volkszaehler.org project
* @package default
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
*/
/*
* This file is part of volkzaehler.org
*
* volkzaehler.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* volkzaehler.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Volkszaehler\View\JSON;
/**
* JSON group view
*
* @author Steffen Vogel <info@steffenvogel.de>
* @package default
*/
class JSONGroupView extends JSONView {
public function add(\Volkszaehler\Model\Group $obj, $recursive = FALSE) {
$group['uuid'] = (string) $obj->getUuid();
$group['name'] = $obj->getName();
$group['description'] = $obj->getDescription();
if ($recursive) { // TODO add nested groups in json view
$children = $obj->getChildren();
foreach ($children as $child) {
$this->addGroup($child, $recursive);
}
}
$this->json['groups'][] = $group;
}
}
?>

View file

@ -23,6 +23,9 @@
namespace Volkszaehler\View;
use Volkszaehler\Model;
use Volkszaehler\Util;
require_once \Volkszaehler\BACKEND_DIR . '/lib/vendor/JpGraph/jpgraph.php';
require_once \Volkszaehler\BACKEND_DIR . '/lib/vendor/JpGraph/jpgraph_scatter.php';
require_once \Volkszaehler\BACKEND_DIR . '/lib/vendor/JpGraph/jpgraph_date.php';
@ -37,7 +40,7 @@ require_once \Volkszaehler\BACKEND_DIR . '/lib/vendor/JpGraph/jpgraph_date.php';
* @link http://jpgraph.net/
* @todo add caching
*/
class JpGraphView extends View {
class JpGraph extends View {
/**
* indicator => ynaxis[n] mapping
*/
@ -90,7 +93,7 @@ class JpGraphView extends View {
* @param $obj
* @param $data
*/
public function add(\Volkszaehler\Model\Channel $obj, array $data) {
public function addChannel(Model\Channel $channel, array $data = NULL){
$count = count($this->channels);
$xData = $yData = array();
foreach ($data as $reading) {
@ -101,7 +104,7 @@ class JpGraphView extends View {
// Create the scatter plot
$plot = new \ScatterPlot($yData, $xData);
$plot->setLegend($obj->getName() . ': ' . $obj->getDescription() . ' [' . $obj->getUnit() . ']');
$plot->setLegend($channel->getName() . ': ' . $channel->getDescription() . ' [' . $channel->getUnit() . ']');
$plot->SetLinkPoints(TRUE, self::$colors[$count]);
$plot->mark->SetColor(self::$colors[$count]);
@ -109,7 +112,7 @@ class JpGraphView extends View {
$plot->mark->SetType(MARK_DIAMOND);
$plot->mark->SetWidth(1);
$axis = $this->getAxisIndex($obj);
$axis = $this->getAxisIndex($channel);
if ($axis >= 0) {
$this->graph->AddY($axis, $plot);
}
@ -117,7 +120,31 @@ class JpGraphView extends View {
$this->graph->Add($plot);
}
$this->channels[] = $obj;
$this->channels[] = $channel;
}
/**
* adds all channel of group as new plots to the graph
*
* @param Model\Group $group
*/
public function addGroup(Model\Group $group) {
foreach ($group->getChannels() as $child) {
$this->addChannel($child);
}
}
public function addDebug(Util\Debug $debug) {
throw new \Exception(get_class($this) . ' cant show debugging information');
}
/**
* shows exception
* @todo avoid graph plotting and set content-type to text/plain
* @param \Exception $exception
*/
protected function addException(\Exception $exception) {
echo $exception;
}
/**
@ -157,13 +184,11 @@ class JpGraphView extends View {
*
* headers has been set automatically
*/
public function render() {
protected function renderResponse() {
$this->graph->SetMargin(75, (count($this->axes) - 1) * 65 + 10, 20, 90);
// Display the graph
$this->graph->Stroke();
parent::render();
}
}

View file

@ -23,9 +23,22 @@
namespace Volkszaehler\View;
use Volkszaehler\Model;
use Volkszaehler\View\HTTP;
use Volkszaehler\Util;
/**
* Interface for all View classes
*
* @author Steffen Vogel <info@steffenvogel.de>
* @package default
*/
interface ViewInterface {
public function addChannel(Model\Channel $channel, array $data = NULL);
function addGroup(Model\Group $group);
function addDebug(Util\Debug $debug);
}
/**
* superclass for all view classes
*
@ -33,7 +46,7 @@ use Volkszaehler\Util;
* @author Steffen Vogel <info@steffenvogel.de>
*
*/
abstract class View {
abstract class View implements ViewInterface {
public $request;
protected $response;
@ -56,26 +69,21 @@ abstract class View {
final public function exceptionHandler(\Exception $exception) {
$this->addException($exception);
//$this->status = STATUS_EXCEPTION; // TODO add status reporting to API
$code = ($exception->getCode() == 0 && HTTP\Response::getCodeDescription($exception->getCode())) ? 400 : $exception->getCode();
$this->response->setCode($code);
$this->render();
$this->renderResponse();
die();
}
public function render() {
public function sendResponse() {
$this->renderResponse();
$this->response->send();
}
public function addException(\Exception $e) {
echo $e;
}
public function addDebug(Util\Debug $debug) {
}
protected abstract function renderResponse();
protected abstract function addException(\Exception $exception);
}
?>

View file

@ -21,10 +21,9 @@
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Volkszaehler\View\XML;
namespace Volkszaehler\View;
use Volkszaehler\View\HTTP;
use Volkszaehler\View;
use Volkszaehler\Util;
/**
@ -33,10 +32,10 @@ use Volkszaehler\Util;
* @author Steffen Vogel <info@steffenvogel.de>
* @package default
*/
abstract class XMLView extends View\View {
class XML extends View {
protected $xmlDoc;
public function __construct(HTTP\Request $request, HTTP\Response $response) {
public function __construct(HTTP\Request $request, HTTP\Response $response) {
parent::__construct($request, $response);
$this->xmlDoc = new \DOMDocument('1.0', 'UTF-8');
@ -49,22 +48,45 @@ abstract class XMLView extends View\View {
$this->response->setHeader('Content-type', 'application/xml; charset=UTF-8');
}
public function render() {
$this->xmlDoc->appendChild($this->xmlRoot);
echo $this->xmlDoc->saveXML();
public function addChannel(Model\Channel $channel, array $data = NULL) {
$xmlChannel = $this->xmlDoc->createElement('channel');
$xmlChannel->setAttribute('uuid', $obj->getUuid());
parent::render();
$xmlChannel->appendChild($this->xmlDoc->createElement('indicator', $obj->getIndicator()));
$xmlChannel->appendChild($this->xmlDoc->createElement('unit', $obj->getUnit()));
$xmlChannel->appendChild($this->xmlDoc->createElement('name', $obj->getName()));
$xmlChannel->appendChild($this->xmlDoc->createElement('description', $obj->getDescription()));
$xmlChannel->appendChild($this->xmlDoc->createElement('resolution', (int) $obj->getResolution()));
$xmlChannel->appendChild($this->xmlDoc->createElement('cost', (float) $obj->getCost()));
if (isset($data)) {
$xmlData = $this->xmlDoc->createElement('data');
foreach ($data as $reading) {
$xmlReading = $this->xmlDoc->createElement('reading');
$xmlReading->setAttribute('timestamp', $reading['timestamp']); // hardcoded data fields for performance optimization
$xmlReading->setAttribute('value', $reading['value']);
$xmlReading->setAttribute('count', $reading['count']);
$xmlData->appendChild($xmlReading);
}
$xmlChannel->appendChild($xmlData);
}
$this->xml->appendChild($xmlChannel);
}
public function addException(\Exception $exception) {
$xmlException = $this->xmlDoc->createElement('exception');
$xmlException->setAttribute('code', $exception->getCode());
$xmlException->appendChild($this->xmlDoc->createElement('message', $exception->getMessage()));
$xmlException->appendChild($this->xmlDoc->createElement('line', $exception->getLine()));
$xmlException->appendChild($this->xmlDoc->createElement('file', $exception->getFile()));
$xmlException->appendChild($this->fromTrace($exception->getTrace()));
public function addGroup(Model\Group $group) {
$xmlGroup = $this->xmlDoc->createElement('group');
$xmlGroup->setAttribute('uuid', $obj->getUuid());
$xmlGroup->appendChild($this->xmlDoc->createElement('name', $obj->getName()));
$xmlGroup->appendChild($this->xmlDoc->createElement('description', $obj->getDescription()));
$this->xmlRoot->appendChild($xmlException);
// TODO include sub groups?
$this->xml->appendChild($xmlGroup);
}
public function addDebug(Util\Debug $debug) {
@ -79,6 +101,21 @@ abstract class XMLView extends View\View {
$this->xmlRoot->appendChild($xmlDebug);
}
protected function addException(\Exception $e) {
$xmlException = $this->xmlDoc->createElement('exception');
$xmlException->setAttribute('code', $exception->getCode());
$xmlException->appendChild($this->xmlDoc->createElement('message', $exception->getMessage()));
$xmlException->appendChild($this->xmlDoc->createElement('line', $exception->getLine()));
$xmlException->appendChild($this->xmlDoc->createElement('file', $exception->getFile()));
$xmlException->appendChild($this->fromTrace($exception->getTrace()));
$this->xmlRoot->appendChild($xmlException);
}
protected function renderResponse() {
}
private function fromTrace($traces) {
$xmlTraces = $this->xmlDoc->createElement('backtrace');

View file

@ -1,81 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2010, The volkszaehler.org project
* @package default
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
*/
/*
* This file is part of volkzaehler.org
*
* volkzaehler.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* volkzaehler.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Volkszaehler\View\XML;
use Volkszaehler\View\HTTP;
/**
* XML channel view
*
* also used for data
*
* @author Steffen Vogel <info@steffenvogel.de>
* @package default
*/
class XMLChannelView extends XMLView {
public function __construct(HTTP\Request $request, HTTP\Response $response) {
parent::__construct($request, $response);
$this->xml = $this->xmlDoc->createElement('channels');
}
public function add(\Volkszaehler\Model\Channel $obj, array $data = NULL) {
$xmlChannel = $this->xmlDoc->createElement('channel');
$xmlChannel->setAttribute('uuid', $obj->getUuid());
$xmlChannel->appendChild($this->xmlDoc->createElement('indicator', $obj->getIndicator()));
$xmlChannel->appendChild($this->xmlDoc->createElement('unit', $obj->getUnit()));
$xmlChannel->appendChild($this->xmlDoc->createElement('name', $obj->getName()));
$xmlChannel->appendChild($this->xmlDoc->createElement('description', $obj->getDescription()));
$xmlChannel->appendChild($this->xmlDoc->createElement('resolution', (int) $obj->getResolution()));
$xmlChannel->appendChild($this->xmlDoc->createElement('cost', (float) $obj->getCost()));
if (isset($data)) {
$xmlData = $this->xmlDoc->createElement('data');
foreach ($data as $reading) {
$xmlReading = $this->xmlDoc->createElement('reading');
$xmlReading->setAttribute('timestamp', $reading['timestamp']); // hardcoded data fields for performance optimization
$xmlReading->setAttribute('value', $reading['value']);
$xmlReading->setAttribute('count', $reading['count']);
$xmlData->appendChild($xmlReading);
}
$xmlChannel->appendChild($xmlData);
}
$this->xml->appendChild($xmlChannel);
}
public function render() {
$this->xmlRoot->appendChild($this->xml);
parent::render();
}
}
?>

View file

@ -1,61 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2010, The volkszaehler.org project
* @package default
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
*/
/*
* This file is part of volkzaehler.org
*
* volkzaehler.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* volkzaehler.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Volkszaehler\View\XML;
use Volkszaehler\View\HTTP;
/**
* XML group view
*
* @author Steffen Vogel <info@steffenvogel.de>
* @package default
*/
class XMLGroupView extends XMLView {
protected $xml;
public function __construct(HTTP\Request $request, HTTP\Request $response) {
parent::__construct($request, $response);
$this->xml = $this->xmlDoc->createElement('groups');
}
public function add(\Volkszaehler\Model\Group $obj) {
$xmlGroup = $this->xmlDoc->createElement('group');
$xmlGroup->setAttribute('uuid', $obj->getUuid());
$xmlGroup->appendChild($this->xmlDoc->createElement('name', $obj->getName()));
$xmlGroup->appendChild($this->xmlDoc->createElement('description', $obj->getDescription()));
// TODO include sub groups?
$this->xml->appendChild($xmlGroup);
}
public function render() {
$this->xmlRoot->appendChild($this->xml);
parent::render();
}
}
?>