[puntoengine] r105 committed - New service test system and xml serialization

1 view
Skip to first unread message

punto...@googlecode.com

unread,
Nov 4, 2011, 11:50:43 PM11/4/11
to punto...@googlegroups.com
Revision: 105
Author: jba...@gmail.com
Date: Fri Nov 4 20:50:00 2011
Log: New service test system and xml serialization
http://code.google.com/p/puntoengine/source/detail?r=105

Added:
/trunk/puntoengine/controllers/ServiceExampleController.php
/trunk/puntoengine/core/http/ServiceController.php
/trunk/puntoengine/core/http/ServiceResponse.php
/trunk/puntoengine/core/http/WebController.php
/trunk/puntoengine/core/http/WebResponse.php
/trunk/puntoengine/core/xml/XmlSerialize.php
Modified:
/trunk/puntoengine/controllers/ExampleController.php
/trunk/puntoengine/core/Kernel.php
/trunk/puntoengine/core/Object.php
/trunk/puntoengine/core/http/HttpController.php
/trunk/puntoengine/core/http/HttpRequest.php
/trunk/puntoengine/core/http/HttpResponse.php

=======================================
--- /dev/null
+++ /trunk/puntoengine/controllers/ServiceExampleController.php Fri Nov 4
20:50:00 2011
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Source code of ServiceExampleController class controller
+ * @category puntoengine
+ * @package controllers
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+
+
+/**
+ * ServiceExampleController is a controller class of the many examples
+ * @category puntoengine
+ * @package controllers
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+class ServiceExampleController extends ServiceController {
+ /**
+ * Other action method
+ */
+ public function otherAction() {
+ //Process the action, connect to database, etc
+ $ex = array( 'test', 'other' => 'value', 'list' => array('juas
juas', 'other other') );
+
+ return $ex;
+ }//otherAction
+}//ServiceExampleController
=======================================
--- /dev/null
+++ /trunk/puntoengine/core/http/ServiceController.php Fri Nov 4 20:50:00
2011
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Source code of ServiceController class
+ * @category puntoengine
+ * @package core
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+
+
+
+/**
+ * ServiceController is a webservice base controller class.
+ * The controller who are the xml request, have a differents methods
+ * to catch the differents types of request and others utilities methods
+ * @category puntoengine
+ * @package core
+ * @subpackage http
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+class ServiceController extends HttpController {
+ /**
+ * Return the request response
+ * @return ServiceResponse Request response
+ * @since 0.5.0
+ */
+ public function getResponse() {
+ if($this->response === null) {
+ $this->response = new ServiceResponse();
+ }
+ return $this->response;
+ }//getResponse
+}//ServiceController
=======================================
--- /dev/null
+++ /trunk/puntoengine/core/http/ServiceResponse.php Fri Nov 4 20:50:00
2011
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Source code of ServiceResponse class
+ * @category puntoengine
+ * @package core
+ * @subpackage http
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+
+
+/**
+ * ServiceResponse is a response for the Controller.
+ * ServiceResponse can set the response xml
+ * @category puntoengine
+ * @package core
+ * @subpackage http
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+class ServiceResponse extends HttpResponse {
+ /**
+ * Type of xml content
+ * @var string
+ * @since 0.5.0
+ */
+ protected $type = 'xml';
+
+
+
+ /**
+ * Process the response and generate the service response
+ * @param HttpRequest $request Request page params
+ * @since 0.5.0
+ * @todo change the header to kernel
+ */
+ public function process(HttpRequest $request) {
+ header('content-type: text/xml');
+ $tag = ucfirst($this->action);
+
+ $xml = '<' . $tag . '>';
+ $xml .= XmlSerialize::serialize($this->response);
+ $xml .= '</' . $tag . '>';
+
+ echo $xml;
+ }//process
+}//ServiceResponse
=======================================
--- /dev/null
+++ /trunk/puntoengine/core/http/WebController.php Fri Nov 4 20:50:00 2011
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Source code of WebController class
+ * @category puntoengine
+ * @package core
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+
+
+
+/**
+ * WebController is a base web controller class.
+ * The web controller who are the web request, have a differents methods
+ * to catch the differents types of request and others utilities methods
+ * same throw error, load a template or redirect to other page.
+ * @category puntoengine
+ * @package core
+ * @subpackage http
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+class WebController extends HttpController {
+ /**
+ * Masterpage for the request
+ * @var string
+ * @since 0.5.0
+ */
+ protected $master;
+
+
+
+ /**
+ * Return the master page
+ * @return string Master page
+ * @since 0.5.0
+ */
+ public function getMasterPage() {
+ return $this->master;
+ }//getMasterPage
+
+
+
+ /**
+ * Set the master page
+ * @param string Master page
+ * @since 0.5.0
+ */
+ public function setMasterPage($masterpage) {
+ $this->master = $masterpage;
+ }//setMasterPage
+
+
+
+ /**
+ * Set the response
+ * @param HttpResponse $response Request response
+ * @since 0.5.0
+ */
+ public function setResponse($response) {
+ $response->setMasterPage($this->master);
+ parent::setResponse($response);
+ }//setResponse
+
+
+
+ /**
+ * Return the request response
+ * @return WebResponse Request response
+ * @since 0.5.0
+ */
+ public function getResponse() {
+ if($this->response === null) {
+ $this->response = new WebResponse();
+ }
+ return $this->response;
+ }//getResponse
+}//HttpController
=======================================
--- /dev/null
+++ /trunk/puntoengine/core/http/WebResponse.php Fri Nov 4 20:50:00 2011
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Source code of WebResponse class
+ * @category puntoengine
+ * @package core
+ * @subpackage http
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+
+
+/**
+ * WebResponse is a response for the WebController.
+ * WebResponse can set the response html, cookies, sessions, and any header
+ * @category puntoengine
+ * @package core
+ * @subpackage http
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.5.0
+ */
+class WebResponse extends HttpResponse {
+ /**
+ * Master page
+ * @var string
+ * @since 0.5.0
+ */
+ protected $master;
+
+
+
+ /**
+ * Return the master page
+ * @return string Master page
+ * @since 0.5.0
+ */
+ public function getMasterPage() {
+ return $this->master;
+ }//getMasterPage
+
+
+
+ /**
+ * Set the master page
+ * @param string Master page
+ * @since 0.5.0
+ */
+ public function setMasterPage($masterpage) {
+ $this->master = $masterpage;
+ }//setMasterPage
+
+
+
+ /**
+ * Process the response and draw or redirect, set the cookies, etc.
+ * @param HttpRequest $request Request page params
+ * @since 0.5.0
+ */
+ public function process(HttpRequest $request) {
+ $content = $this->processView($request);
+
+ if($this->master != null) {
+ $master = $this->processMasterPage($request, $content);
+ $content = $master;
+ }
+
+ echo $content;
+ }//process
+
+
+
+ /**
+ * Process the masterpge and the content of the page loading the
dinamic content
+ * @param HttpRequest $request Request page params
+ * @since 0.5.0
+ */
+ protected function processMasterPage(HttpRequest $request, $content) {
+ $master = $this->addTemplate($this->master, $request);
+ preg_match('/<php:place\s*name="content"\s*\/>/', $master, $match);
+
+ $master = str_replace($match[0], $content, $master);
+
+ return $master;
+ }//processMasterPage
+
+
+
+ /**
+ * Process the view of the content of the page loading the dinamic
content
+ * @param HttpRequest $request Request page params
+ * @since 0.5.0
+ */
+ protected function processView(HttpRequest $request) {
+ $content =
$this->addTemplate('/template/'.$this->controller.'/'.$this->action.'.php',
$request);
+
+ return $content;
+ }//processView
+
+
+
+ /**
+ * Add a new template, same a addDispatcher but without static access
+ * @param string $template Template path
+ * @param HttpRequest $request Page request
+ * @return string Template content
+ * @since 0.5.0
+ */
+ protected function addTemplate($template, HttpRequest $request) {
+ if(file_exists(Kernel::getPath().'/template/'.$template)) {
+ include(Kernel::getPath().'/template/'.$template);
+ } elseif(file_exists(Kernel::getPath().$template)) {
+ include(Kernel::getPath().$template);
+ } else {
+ throw new IOException(ExceptionCodes::IO_NOTFOUND, $template);
+ }
+
+ $out = ob_get_contents();
+ ob_clean();
+
+ return $out;
+ }//addTemplate
+}//WebResponse
=======================================
--- /dev/null
+++ /trunk/puntoengine/core/xml/XmlSerialize.php Fri Nov 4 20:50:00 2011
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Source code of XmlSerialize class
+ * @category puntoengine
+ * @package core
+ * @subpackage xml
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.4.0
+ */
+
+
+
+/**
+ * XmlSerialize is a serializer class for objects
+ * @category puntoengine
+ * @package core
+ * @subpackage xml
+ * @author Juan Benavides Romero <jba...@gmail.com>
+ * @since 0.4.0
+ */
+class XmlSerialize extends Object {
+ public static function serialize($mixed) {
+ $tag = 'Node';
+
+ if(gettype($mixed) == 'array') {
+ $tag = 'Array';
+ }
+
+ return self::process($mixed, $tag);
+ }
+
+
+ protected static function process($mixed, $tag = 'Node') {
+ $xml = null;
+ $tag = ucfirst($tag);
+
+ switch(gettype($mixed)) {
+ case 'array':
+ $xml = self::serializeArray($mixed, $tag);
+ break;
+ case 'string':
+ $xml = self::serializeString($mixed, $tag);
+ case 'object':
+ break;
+ default:
+ echo gettype($mixed); die;
+ throw new NotImplementedException(__METHOD__);
+ }
+
+ return $xml;
+ }
+
+
+ protected static function serializeString($string, $tag = 'String') {
+ $xml = '<'.$tag.'>';
+ $xml .= $string;
+ $xml .= '</'.$tag.'>';
+
+ return $xml;
+ }
+
+
+ protected static function serializeArray(array $array, $tag = 'Array') {
+ ksort($array, SORT_STRING);
+
+ $xml = '<'.$tag.'>';
+
+ foreach($array as $key => $value) {
+ if(is_numeric($key)) {
+ $key = 'Item';
+ }
+
+ $xml .= self::process($value, $key);
+ }
+
+ $xml .= '</'.$tag.'>';
+
+ return $xml;
+ }
+}
=======================================
--- /trunk/puntoengine/controllers/ExampleController.php Fri Nov 4
17:33:02 2011
+++ /trunk/puntoengine/controllers/ExampleController.php Fri Nov 4
20:50:00 2011
@@ -11,11 +11,11 @@
/**
* ExampleController is a controller class of the many examples
* @category puntoengine
- * @package servlets
+ * @package controllers
* @author Juan Benavides Romero <jba...@gmail.com>
* @since 0.4.0
*/
-class ExampleController extends HttpController {
+class ExampleController extends WebController {

/**
* Master page
@@ -24,6 +24,7 @@
protected $master = 'Example/master.php';


+
/**
* Default action method
*/
=======================================
--- /trunk/puntoengine/core/Kernel.php Fri Nov 4 17:33:02 2011
+++ /trunk/puntoengine/core/Kernel.php Fri Nov 4 20:50:00 2011
@@ -165,11 +165,25 @@
$request->setSession($_SESSION);

$response = $controller->getResponse();
-
+
+
+ ob_start();
+ ob_clean();
+
$response->process($request);
+
+ if(ob_get_length() != 0) {
+ ob_end_flush();
+ }
}//process


+
+ /**
+ * Return the mime type of file based in extension of the file
+ * @param string $extension Extension of file to obtain the mime type
+ * @return string Mime type
+ */
public static function getMime($extension) {
switch($extension) {
case 'css': $mime = 'text/css'; break;
@@ -178,7 +192,8 @@
}

return $mime;
- }
+ }//getMime
+


/**
@@ -312,97 +327,18 @@

$controller = new $controllerClass();

- $response = new HttpResponse();
+ $response = $controller->getResponse();
$response->setController($controllerName);
$response->setAction($methodName);
- $response->setMasterPage($controller->getMasterPage());

$controller->setResponse($response);
- $controller->$methodAction();
+ $controller->getResponse()->setResponse($controller->$methodAction());
}

return $controller;
}//getController


-
- /**
- * Load a Servlet by the name in the request. Search in configuration
xml
- * and load the matched servlet or throw a exception when don't found a
- * matched servlet
- * @param string $servletName Name of request servlet to load
- * @return HttpServlet Servlet who matched with the request
- * @since 0.3
- * @deprecated Since version 0.4.0 by getController
- */
- private static function getServlet($servletName) {
- $url = new Url($servletName);
-
- echo '<pre>';
- print_r($url);
- print_r($url->getControllers());
-
- echo json_encode($url->getControllers());
-
- $controlers = $url->getControllers();
-
- for($i = 0; $i < count($controlers); $i++) {
- $tempController = array();
- if(strpos($controlers[$i], '.')) {
- $tempController = explode('.', $controlers[$i]);
- print_r($tempController);
- //if(class_exists($tempController[0], true) && method_exists($object,
$method_name))
- if(class_exists($tempController[0].'Controller', true) &&
is_subclass_of($tempController[0].'Controller', 'HttpController')) {
- if(method_exists($tempController[0].'Controller',
$tempController[1].'Action')) {
- echo 'si method';
- } else {
- echo 'no method';
- }
- }
- } else {
- $tempController[0] = $controlers[$i];
-
- if(class_exists($tempController[0].'Controller', true)) {
- echo 'existe';
- }
- }
- }
-
- echo '</pre>';
- die;
-
-
- $document = new XmlDocument();
-
- $document->loadXmlFile('/config/web.xml');
-
- try {
- if(substr($servletName, -1) == '/') {
- $servletClass =
$document->selectSingleNode('/Web/Servlets/Servlet[Patterns/Pattern
= "'.$servletName.'" or Patterns/Pattern = "'.substr($servletName, 0,
-1).'"]/Class');
- } else {
- $servletClass =
$document->selectSingleNode('/Web/Servlets/Servlet[Patterns/Pattern
= "'.$servletName.'"]/Class');
- }
- } catch(XmlException $exception) {
- $servletAux = explode('/', $servletName);
-
- $servletClass =
$document->selectSingleNode('/Web/Servlets/Servlet[Patterns/Pattern
= "/'.$servletAux[1].'/*"]/Class');
- }
-
- if(class_exists($servletClass)) {
- eval('$servlet = new '.$servletClass.'();');
- $servlet->setUrl($servletName);
-
- if(isset($servletAux[2])) {
- $servlet->setAction($servletAux[2]);
- }
- } else {
- throw new
CoreException(ExceptionCodes::CORE_CLASSNOTFOUND, 'Class '.$servletClass.'
not found');
- }
-
- return $servlet;
- }//getServlet
-
-

/**
* Catch a error and manage it with a internal exception manager
=======================================
--- /trunk/puntoengine/core/Object.php Fri Nov 4 17:33:02 2011
+++ /trunk/puntoengine/core/Object.php Fri Nov 4 20:50:00 2011
@@ -12,7 +12,7 @@
/**
* Object is a base class of all class of engine and
* @category puntoengine
- * @package servlets
+ * @package core
* @author Juan Benavides Romero <jba...@gmail.com>
* @since 0.4.0
*/
@@ -165,6 +165,6 @@
* @todo Implement this method
*/
public function toXml() {
- throw new NotImplementedException(__CLASS__ . '::' . __METHOD__);
+ return XmlSerialize::serialize($this);
}//toXml
}//Object
=======================================
--- /trunk/puntoengine/core/http/HttpController.php Fri Nov 4 17:33:02 2011
+++ /trunk/puntoengine/core/http/HttpController.php Fri Nov 4 20:50:00 2011
@@ -45,6 +45,9 @@
* @since 0.4.0
*/
public function getResponse() {
+ if($this->response === null) {
+ $this->response = new HttpResponse();
+ }
return $this->response;
}//getResponse

@@ -55,7 +58,7 @@
* @param HttpResponse $response Request response
* @since 0.4.0
*/
- public function setResponse(HttpResponse $response) {
+ public function setResponse($response) {
$this->response = $response;
}//setResponse

=======================================
--- /trunk/puntoengine/core/http/HttpRequest.php Fri Nov 4 17:33:02 2011
+++ /trunk/puntoengine/core/http/HttpRequest.php Fri Nov 4 20:50:00 2011
@@ -19,7 +19,7 @@
* @author Juan Benavides Romero <jba...@gmail.com>
* @since 0.1.1
*/
-class HttpRequest {
+class HttpRequest extends Object {
/**
* Request parameters
* @var array
=======================================
--- /trunk/puntoengine/core/http/HttpResponse.php Fri Nov 4 17:33:02 2011
+++ /trunk/puntoengine/core/http/HttpResponse.php Fri Nov 4 20:50:00 2011
@@ -33,15 +33,24 @@
* @since 0.4.0
*/
protected $action;
+


+ /**
+ * Controler execution response
+ * @var mixed
+ * @since 0.5.0
+ */
+ protected $response;
+
+

/**
- * Master page
- * @var string
- * @since 0.4.0
+ * Type of content same as xml, jpeg, png, html, etc
+ * @var string
+ * @since 0.5.0
*/
- protected $master;
+ protected $type = 'html';

@@ -54,6 +63,39 @@

+ /**
+ * Return the type of content
+ * @return string Type of content
+ * @since 0.5.0
+ */
+ public function getType() {
+ return $this->type;
+ }//getResponse
+
+
+
+ /**
+ * Return the response of controller action
+ * @return string Response of controller action
+ * @since 0.5.0
+ */
+ public function getResponse() {
+ return $this->response;
+ }//getResponse
+
+
+
+ /**
+ * Set the response of controller action
+ * @param string $controller Controller name
+ * @since 0.5.0
+ */
+ public function setResponse($response) {
+ $this->response = $response;
+ }//setResponse
+
+
+
/**
* Return the controller name
* @return string Controller name

Reply all
Reply to author
Forward
0 new messages