/**
  *
  * @param <String> $rev_id
  * @param <String> $sessionId
  * @param <Object> $model boModel
  * @param <Object> $blobCB=0 (should have been a causal barrier object but
  * not used yet)
  */
 static function storeModel($rev_id, $sessionId, $model, $blobCB)
 {
     wfDebugLog('p2p', ' -> store model into revid : ' . $rev_id . ' sessionid : ' . $sessionId . ' model : ' . $model->getText());
     try {
         $dao = new dao();
         $dao->storeModel($rev_id, $sessionId, $model, $blobCB);
     } catch (Exception $e) {
         die($e->getMessage());
         throw new MWException(__METHOD__ . ' db access problems');
     }
 }
Пример #2
0
 /**
  * This function generates an error message based on whats returned from the DbObject validation method
  * $w is for the error() function
  * $object is the object that one is saving/updating whatever
  * $type is for the message returned, i.e. "Updating this $type failed"
  * $response is the reponse array from the validation method
  * $isUpdating is a helper for the message i.e. creating/updating
  * $returnUrl is where the redirection in error() will go
  * 
  * @param <Object> $object
  * @param <String> $type
  * @param <Array|Boolean> $response
  * @param <Boolean> $isUpdating
  * @param <String> $returnUrl
  * @return null
  */
 function errorMessage($object, $type = null, $response = true, $isUpdating = false, $returnUrl = "/")
 {
     if ($response === true || empty($type)) {
         return;
     } else {
         if (is_array($response)) {
             $errorMsg = ($isUpdating ? "Updating" : "Creating") . " this {$type} failed because<br/><br/>\n";
             foreach ($response["invalid"] as $property => $reason) {
                 foreach ($reason as $r) {
                     $errorMsg .= $object->getHumanReadableAttributeName($property) . ": {$r} <br/>\n";
                 }
             }
             $this->Log->error("System: Saving " . get_class($object) . " error: " . $errorMsg);
             $this->error($errorMsg, $returnUrl);
         } else {
             $this->Log->error("System: " . ($isUpdating ? "Updating" : "Creating") . " this {$type} failed.");
             $this->error(($isUpdating ? "Updating" : "Creating") . " this {$type} failed.", $returnUrl);
         }
     }
 }
Пример #3
0
 /**
  * Function to get contents of this task
  * @param <Object> $entity
  * @return <Array> contents
  */
 public function getContents($entity, $entityCache = false)
 {
     if (!$this->contents) {
         global $adb, $current_user;
         $taskContents = array();
         $entityId = $entity->getId();
         $utils = new VTWorkflowUtils();
         $adminUser = $utils->adminUser();
         if (!$entityCache) {
             $entityCache = new VTEntityCache($adminUser);
         }
         $fromUserId = Users::getActiveAdminId();
         $entityOwnerId = $entity->get('assigned_user_id');
         if ($entityOwnerId) {
             list($moduleId, $fromUserId) = explode('x', $entityOwnerId);
         }
         $ownerEntity = $entityCache->forId($entityOwnerId);
         if ($ownerEntity->getModuleName() === 'Groups') {
             list($moduleId, $recordId) = vtws_getIdComponents($entityId);
             $fromUserId = Vtiger_Util_Helper::getCreator($recordId);
         }
         if ($this->fromEmail && !($ownerEntity->getModuleName() === 'Groups' && strpos($this->fromEmail, 'assigned_user_id : (Users) ') !== false)) {
             $et = new VTEmailRecipientsTemplate($this->fromEmail);
             $fromEmailDetails = $et->render($entityCache, $entityId);
             $con1 = strpos($fromEmailDetails, '&lt;');
             $con2 = strpos($fromEmailDetails, '&gt;');
             if ($con1 && $con2) {
                 list($fromName, $fromEmail) = explode('&lt;', $fromEmailDetails);
                 list($fromEmail, $rest) = explode('&gt;', $fromEmail);
             } else {
                 $fromName = "";
                 $fromEmail = $fromEmailDetails;
             }
         } else {
             $userObj = CRMEntity::getInstance('Users');
             $userObj->retrieveCurrentUserInfoFromFile($fromUserId);
             if ($userObj) {
                 $fromEmail = $userObj->email1;
                 $fromName = $userObj->user_name;
             } else {
                 $result = $adb->pquery('SELECT user_name, email1 FROM vtiger_users WHERE id = ?', array($fromUserId));
                 $fromEmail = $adb->query_result($result, 0, 'email1');
                 $fromName = $adb->query_result($result, 0, 'user_name');
             }
         }
         if (!$fromEmail) {
             $utils->revertUser();
             return false;
         }
         $taskContents['fromEmail'] = $fromEmail;
         $taskContents['fromName'] = $fromName;
         if ($entity->getModuleName() === 'Events') {
             $contactId = $entity->get('contact_id');
             if ($contactId) {
                 $contactIds = '';
                 list($wsId, $recordId) = explode('x', $entityId);
                 $webserviceObject = VtigerWebserviceObject::fromName($adb, 'Contacts');
                 $result = $adb->pquery('SELECT contactid FROM vtiger_cntactivityrel WHERE activityid = ?', array($recordId));
                 $numOfRows = $adb->num_rows($result);
                 for ($i = 0; $i < $numOfRows; $i++) {
                     $contactIds .= vtws_getId($webserviceObject->getEntityId(), $adb->query_result($result, $i, 'contactid')) . ',';
                 }
             }
             $entity->set('contact_id', trim($contactIds, ','));
             $entityCache->cache[$entityId] = $entity;
         }
         $et = new VTEmailRecipientsTemplate($this->recepient);
         $toEmail = $et->render($entityCache, $entityId);
         $ecct = new VTEmailRecipientsTemplate($this->emailcc);
         $ccEmail = $ecct->render($entityCache, $entityId);
         $ebcct = new VTEmailRecipientsTemplate($this->emailbcc);
         $bccEmail = $ebcct->render($entityCache, $entityId);
         if (strlen(trim($toEmail, " \t\n,")) == 0 && strlen(trim($ccEmail, " \t\n,")) == 0 && strlen(trim($bccEmail, " \t\n,")) == 0) {
             $utils->revertUser();
             return false;
         }
         $taskContents['toEmail'] = $toEmail;
         $taskContents['ccEmail'] = $ccEmail;
         $taskContents['bccEmail'] = $bccEmail;
         $st = new VTSimpleTemplate($this->subject);
         $taskContents['subject'] = $st->render($entityCache, $entityId);
         $ct = new VTSimpleTemplate($this->content);
         $taskContents['content'] = $ct->render($entityCache, $entityId);
         $this->contents = $taskContents;
         $utils->revertUser();
     }
     if (is_array($this->contents)) {
         $this->contents = Zend_Json::encode($this->contents);
     }
     return $this->contents;
 }
Пример #4
0
    /**
     * $action=admin is generated when the administration tab is clicked
     * Calculates every that is displayed on this page (cf user manual)
     *
     * @global <Object> $wgOut output page instance
     * @global <Object> $wgCachePages
     * @global <String> $wgServerName
     * @global <String> $wgScriptPath
     * @param <String> $action
     * @param <Object> $article
     * @return <bool>
     */
    function onUnknownAction($action, $article)
    {
        global $wgOut, $wgCachePages, $wgServerName, $wgScriptPath, $wgScriptExtension;
        $urlServer = 'http://' . $wgServerName . $wgScriptPath;
        $wgCachePages = false;
        //Verify that the action coming in is "admin"
        if ($action == "admin") {
            wfDebugLog('p2p', 'Admin page');
            if ($article->mTitle->getNamespace() == 0) {
                $title = $article->mTitle->getText();
            } else {
                $title = $article->mTitle->getNsText() . ':' . $article->mTitle->getText();
            }
            wfDebugLog('p2p', ' -> title : ' . $title);
            $wgOut->setPagetitle('DSMW on ' . $title);
            //part list of patch
            $patchs = utils::orderPatchByPrevious($title);
            $wgOut->addWikiText('[[Special:ArticleAdminPage|DSMW Admin functions]]

==Features==');
            $output = '<div style="width:60%;height:40%;overflow:auto;">
<table style="border-bottom: 2px solid #000;">
<caption><b>List of patchs</b></caption>';
            //color the remote patch of the current page
            foreach ($patchs as $patch) {
                wfDebugLog('p2p', '  -> patchId : ' . $patch);
                if (!utils::isRemote($patch)) {
                    wfDebugLog('p2p', '      -> remote patch');
                    $output .= '<tr BGCOLOR="#CCCCCC"><td>' . wfTimestamp(TS_RFC2822, $article->getTimestamp()) . ' : </td>';
                    // $output .= '<tr><td BGCOLOR="#33CC00"><a href="'.$_SERVER['PHP_SELF'].'?title='.$patch.'">'.$patch.'</a></td>';
                } else {
                    wfDebugLog('p2p', '      -> local patch');
                    $output .= '<tr><td>' . wfTimestamp(TS_RFC2822, $article->getTimestamp()) . ' : </td>';
                    //$output .= '<tr><td><a href="'.$_SERVER['PHP_SELF'].'?title='.$patch.'">'.$patch.'</a></td>';
                }
                //count the number of delete and insert operations into the patch
                $results = array();
                $op = utils::getSemanticQuery('[[Patch:+]][[patchID::' . $patch . ']]', '?hasOperation');
                $count = $op->getCount();
                for ($i = 0; $i < $count; $i++) {
                    $row = $op->getNext();
                    if ($row === false) {
                        break;
                    }
                    $row = $row[1];
                    $col = $row->getContent();
                    //SMWResultArray object
                    foreach ($col as $object) {
                        //SMWDataValue object
                        $wikiValue = $object->getWikiValue();
                        $results[] = $wikiValue;
                    }
                }
                $countOp = utils::countOperation($results);
                //old code passed $op parameter
                $output .= '<td>' . $countOp['insert'] . '  insert, ' . $countOp['delete'] . ' delete</td>';
                $output .= '<td>(<a href="' . $_SERVER['PHP_SELF'] . '?title=' . $patch . '">' . $patch . '</a>)</td></tr>';
                /*$titlePatch = Title::newFromText( $patch,PATCH );
                  $article = new Article( $title );*/
            }
            $output .= '</table></div>';
            //list of push
            $pushs = array();
            $res = utils::getSemanticQuery('[[ChangeSet:+]][[hasPatch::' . $patchs[0] . ']][[inPushFeed::+]]', '?inPushFeed');
            $count = $res->getCount();
            for ($i = 0; $i < $count; $i++) {
                $row = $res->getNext();
                if ($row === false) {
                    break;
                }
                $row = $row[1];
                $col = $row->getContent();
                //SMWResultArray object
                foreach ($col as $object) {
                    //SMWDataValue object
                    $wikiValue = $object->getWikiValue();
                    $pushs[] = $wikiValue;
                }
            }
            if (!empty($pushs)) {
                $output .= '<br><div style="width:60%;height:40%;overflow:auto;"><table style="border-bottom: 2px solid #000;"><caption><b>List of pushs</b></caption>';
                foreach ($pushs as $push) {
                    $pushName = $push;
                    $output .= '<tr><td align="right" width="50%"><a href="' . $_SERVER['PHP_SELF'] . '?title=' . $pushName . '">' . $pushName . '</a> : </td>';
                    //count the number of published patchs by the current pushFeed for the current page
                    $published = utils::getPublishedPatchs($urlServer, $pushName, $title);
                    //$publishedInPush = utils::getSemanticRequest('http://'.$wgServerName.$wgScriptPath, '', $param);
                    //count the number of unpublished patchs
                    $unpublished = array_diff($patchs, $published);
                    if (!is_null($unpublished) && count($unpublished) > 0) {
                        $output .= '<td align="left" width="50%">' . count($unpublished) . ' unpublished patchs on ' . count($patchs) . ' </td></tr>';
                    } else {
                        $output .= '<td align="left" width="50%"> all ' . $title . "'" . 'patchs are pushed </td></tr>';
                    }
                }
                $output .= '</table></div>';
            }
            //end if empty $pushs
            //part list of pull
            $pulls = array();
            $res = utils::getSemanticQuery('[[ChangeSet:+]][[hasPatch::' . $patchs[0] . ']][[inPullFeed::+]]', '?inPullFeed');
            $count = $res->getCount();
            for ($i = 0; $i < $count; $i++) {
                $row = $res->getNext();
                if ($row === false) {
                    break;
                }
                $row = $row[1];
                $col = $row->getContent();
                //SMWResultArray object
                foreach ($col as $object) {
                    //SMWDataValue object
                    $wikiValue = $object->getWikiValue();
                    $pulls[] = $wikiValue;
                }
            }
            if (!empty($pulls)) {
                $output .= '<br><div style="width:60%;height:40%;overflow:auto;"><table style="border-bottom: 2px solid #000;"><caption><b>List of pull</b></caption>';
                foreach ($pulls as $pull) {
                    $pullName = $pull;
                    $pushServer = getPushURL($pullName);
                    $pushName = getPushName($pullName);
                    $output .= '<tr><td align="right" width="50%"><a href="' . $_SERVER['PHP_SELF'] . '?title=' . $pullName . '">' . $pullName . '</a> : </td>';
                    $pulledPatch = utils::getPulledPatches($pullName);
                    $patchs = array();
                    foreach ($pulledPatch as $patch) {
                        $onPage = array();
                        $res = utils::getSemanticQuery('[[Patch:+]][[patchID::' . $patch . ']]', '?onPage');
                        $count = $res->getCount();
                        for ($i = 0; $i < $count; $i++) {
                            $row = $res->getNext();
                            if ($row === false) {
                                break;
                            }
                            $row = $row[1];
                            $col = $row->getContent();
                            //SMWResultArray object
                            foreach ($col as $object) {
                                //SMWDataValue object
                                $wikiValue = $object->getWikiValue();
                                $onPage[] = $wikiValue;
                            }
                        }
                        if ($onPage[0] == $title) {
                            $patchs[] = $patch;
                        }
                    }
                    $published = utils::getPublishedPatchs($pushServer, $pushName, $title);
                    if (!is_null($published)) {
                        $unpublished = array_diff($patchs, $published);
                        $t = count($published);
                        $t = count($patchs);
                        $count = count($published) - count($patchs);
                        $output .= '<td align="left" width="50%"> ' . $count . ' unpulled patchs </td></tr>';
                    } else {
                        $output .= '<td align="left" width="50%"> up to date </td></tr>';
                    }
                }
                $output .= '</table></div>';
            }
            //end if empty $pulls
            //part push page
            $url = "http://" . $wgServerName . $wgScriptPath . "/index{$wgScriptExtension}";
            $output .= '
<h2>Actions</h2>
<div><FORM  name="formPush">
<table >
<tr><td> <input type="button" value="PUSH" onClick="pushpage(\'' . $url . '\',\'' . $title . '\');"></input></td></tr></table></form></div>
This [Push page : "' . $title . '"] action will create a PushFeed and
publish the modifications of the "' . $title . '" article

<div id="pushstatus" style="display: none; width: 100%; clear: both;" >
<a name="PUSH_Progress_:" id="PUSH_Progress_:"></a><h2> <span class="mw-headline"> PUSH Progress&nbsp;: </span></h2>
<div id="statepush" ></div><br />
</div>
';
            $wgOut->addHTML($output);
            return false;
        } else {
            return true;
        }
    }
Пример #5
0
 /**
  * utility function used in the binary search
  * @param <Object> $position1 LogootPosition
  * @param <Object> $position2 LogootPosition
  * @return <Integer> -1, 0 or 1
  */
 private function dichoComp1($position1, $position2)
 {
     // if both positions are 1 vector Ids
     if ($position1->size() == 1 && $position2->size() == 1) {
         $tab1 = $position1->getThisPosition();
         $tab2 = $position2->getThisPosition();
         if ($position1->lessThan($tab1[0], $tab2[0])) {
             return -1;
         }
         if ($position1->greaterThan($tab1[0], $tab2[0])) {
             return 1;
         }
         if ($position1->equals($tab1[0], $tab2[0])) {
             return 0;
         }
     } else {
         // else if both logootIds are n vectors Ids
         if ($position1->nLessThan($position2)) {
             return -1;
         }
         if ($position1->nGreaterThan($position2)) {
             return 1;
         }
         if ($position1->nEquals($position2)) {
             return 0;
         }
     }
 }
Пример #6
0
/**
 * MW Hook used to redirect to page creation (pushfeed, pullfeed, changeset),
 * to forms or to push/pull action testing the action param
 *
 *
 * @global <Object> $wgOut
 * @param <Object> $action
 * @param <Object> $article
 * @return <boolean>
 */
function onUnknownAction($action, $article)
{
    global $wgOut, $wgServerName, $wgScriptPath, $wgUser, $wgScriptExtension, $wgDSMWIP;
    $urlServer = 'http://' . $wgServerName . $wgScriptPath . "/index{$wgScriptExtension}";
    $urlAjax = 'http://' . $wgServerName . $wgScriptPath;
    //////////pull form page////////
    if (isset($_GET['action']) && $_GET['action'] == 'addpullpage') {
        wfDebugLog('p2p', '@@@@@@@@@@@@@@@@@@  addPullPage ');
        $newtext = "Add a new site:\n<div id='dsmw' style=\"color:green;\"></div>\n\n{{#form:action=" . $urlServer . "?action=pullpage|method=POST|\nPushFeed Url: {{#input:type=button|value=Url test|onClick=\nvar url = document.getElementsByName('url')[0].value;\nif(url.indexOf('PushFeed')==-1){\nalert('No valid PushFeed syntax, see example.');\n}else{\nvar urlTmp = url.substring(0,url.indexOf('PushFeed'));\n//alert(urlTmp);\n\nvar pos1 = urlTmp.indexOf('index.php');\n//alert(pos1);\nvar pushUrl='';\nif(pos1!=-1){\npushUrl = urlTmp.substring(0,pos1);\n//alert('if');\n}else{\npushUrl = urlTmp;\n//alert('else');\n}\n//alert(pushUrl);\n\n//alert(pushUrl+'api.php?action=query&meta=patch&papatchId=1&format=xml');\nvar xhr_object = null;\n\n\t   if(window.XMLHttpRequest) // Firefox\n\t      xhr_object = new XMLHttpRequest();\n\t   else if(window.ActiveXObject) // Internet Explorer\n\t      xhr_object = new ActiveXObject('Microsoft.XMLHTTP');\n\t   else {\n\t      alert('Votre navigateur ne supporte pas les objets XMLHTTPRequest...');\n\t      return;\n\t   }\n          try{ xhr_object.open('GET', '" . $urlAjax . "/extensions/DSMW/files/ajax.php?url='+escape(pushUrl+'api.php?action=query&meta=patch&papatchId=1&format=xml'), true);}\n          catch(e){\n                    //alert('There is no DSMW Server responding at this URL');\n                    document.getElementById('dsmw').innerHTML = 'There is no DSMW Server responding at this URL!';\n                    document.getElementById('dsmw').style.color = 'red';\n                  }\n           xhr_object.onreadystatechange = function() {\n\nif(xhr_object.readyState == 4) {\n            if(xhr_object.statusText=='OK'){\n                if(xhr_object.responseText == 'true'){ //alert('URL valid, there is a DSMW Server responding');\n                        document.getElementById('dsmw').innerHTML = 'URL valid, there is a DSMW Server responding!';\n                        document.getElementById('dsmw').style.color = 'green';\n                  }\n                else{ //alert('There is no DSMW Server responding at this URL');\n                        document.getElementById('dsmw').innerHTML = 'There is no DSMW Server responding at this URL!';\n                        document.getElementById('dsmw').style.color = 'red';\n                  }\n                }\n                else{\n                //alert('There is no DSMW Server responding at this URL');\n                document.getElementById('dsmw').innerHTML = 'There is no DSMW Server responding at this URL!';\n                document.getElementById('dsmw').style.color = 'red';\n}\n\t\t  }\n\t   }\n\n\t   xhr_object.send(null);\n}\n}}<br>        {{#input:type=text|name=url|size=50}} <b>e.g. http://server/path/index.php?title=PushFeed:PushName</b><br>\nPullFeed Name:   <br>    {{#input:type=text|name=pullname}}<br>\n{{#input:type=submit|value=ADD}}\n}}";
        //if article doesn't exist insertNewArticle
        if ($article->mTitle->exists()) {
            $article->updateArticle($newtext, $summary = "", false, false);
        } else {
            $article->insertNewArticle($newtext, $summary = "", false, false);
        }
        $article->doRedirect();
        return false;
    } elseif (isset($_GET['action']) && $_GET['action'] == 'addpushpage') {
        wfDebugLog('p2p', '@@@@@@@@@@@@@@@@ addPushPage');
        $specialAsk = $urlServer . '?title=Special:Ask';
        $newtext = "Add a new pushfeed:\n\n{{#form:action=" . $urlServer . "?action=pushpage|method=POST|\nPushFeed Name:   <br>    {{#input:class=test|name=name|type=text|onKeyUp=test('{$urlServer}');}}<div style=\"display:inline; \" id=\"state\" ></div><br />\nRequest: {{#input:type=button|value=Test your query|title=click here to test your query results|onClick=\nvar query = document.getElementsByName('keyword')[0].value;\nvar query1 = encodeURI(query);\nwindow.open('" . $specialAsk . "&q='+query1+'&eq=yes&p%5Bformat%5D=broadtable','querywindow','menubar=no, status=no, scrollbars=yes, menubar=no, width=1000, height=900');}}\n  <br>{{#input:type=textarea|cols=30 | style=width:auto |rows=2|name=keyword}} <b>e.g. [[Category:city]][[locatedIn::France]]</b><br>\n{{#input:type=submit|value=ADD}}\n}}";
        $article->doEdit($newtext, $summary = "");
        $article->doRedirect();
        return false;
    } elseif (isset($_GET['action']) && $_GET['action'] == 'pushpage') {
        //$url = $_POST['url'];//pas url mais changesetId
        wfDebugLog('p2p', '@@@@@@@@@@@@@@@@@ Create new push ' . $_POST['name'] . ' with ' . $_POST['keyword']);
        $name = $_POST['name'];
        $request = $_POST['keyword'];
        $stringReq = utils::encodeRequest($request);
        //avoid "semantic injection" :))
        //addPushSite($url, $name, $request);
        $newtext = "\n[[Special:ArticleAdminPage|DSMW Admin functions]]\n\n==Features==\n[[name::PushFeed:" . $name . "| ]]\n'''Semantic query:''' [[hasSemanticQuery::" . $stringReq . "| ]]<nowiki>" . $request . "</nowiki>\n\n'''Pages concerned:'''\n{{#ask: " . $request . "}}\n[[deleted::false| ]]\n\n==Actions==\n\n{{#input:type=ajax|value=PUSH|onClick=pushpull('" . $urlServer . "','PushFeed:" . $name . "', 'onpush');}}\nThe \"PUSH\" action publishes the (unpublished) modifications of the articles listed above.\n\n== PUSH Progress : ==\n<div id=\"state\" ></div><br />\n";
        wfDebugLog('p2p', '  -> push page contains : ' . $newtext);
        $title = Title::newFromText($_POST['name'], PUSHFEED);
        $article = new Article($title);
        $edit = $article->doEdit($newtext, $summary = "");
        $article->doRedirect();
        return false;
    } elseif (isset($_POST['action']) && $_POST['action'] == 'onpush') {
        wfDebugLog('p2p', '@@@@@@@@@@@@  ChangeSet page');
        /* In case we push directly from an article page */
        if (isset($_POST['page']) && isset($_POST['request'])) {
            $articlename = Title::newFromText($_POST['name']);
            if (!$articlename->exists()) {
                $result = utils::createPushFeed($_POST['name'], $_POST['request']);
                utils::writeAndFlush("Create push <A HREF=" . 'http://' . $wgServerName . $wgScriptPath . "/index.php?title=" . $_POST['name'] . ">" . $_POST['name'] . "</a>");
                if ($result == false) {
                    throw new MWException(__METHOD__ . ': no Pushfeed created in utils:: createPushFeed:
                        name: ' . $_POST['name'] . ' request' . $_POST['request']);
                }
            }
        }
        wfDebugLog('p2p', 'push on ');
        $patches = array();
        $tmpPatches = array();
        if (isset($_POST['name'])) {
            $name1 = $_POST['name'];
            if (!is_array($name1)) {
                $name1 = array($name1);
            }
            foreach ($name1 as $push) {
                wfDebugLog('p2p', ' - ' . $push);
            }
        } else {
            $name1 = "";
        }
        if ($name1 == "") {
            utils::writeAndFlush('<p><b>No pushfeed selected!</b></p>');
            $title = Title::newFromText('Special:ArticleAdminPage');
            $article = new Article($title);
            $article->doRedirect();
            return false;
        }
        //$name = $name1[0];
        utils::writeAndFlush('<p><b>Start push </b></p>');
        foreach ($name1 as $name) {
            utils::writeAndFlush("<span style=\"margin-left:30px;\">begin push: <A HREF=" . 'http://' . $wgServerName . $wgScriptPath . "/index.php?title={$name}>" . $name . "</a></span> <br/>");
            $patches = array();
            //// for each pushfeed name==> push
            wfDebugLog('p2p', '  -> pushname ' . $name);
            // $name = $_GET['name'];//PushFeed name
            $request = getPushFeedRequest($name);
            //        $previousCSID = getPreviousCSID($name);
            $previousCSID = getHasPushHead($name);
            if ($previousCSID == false) {
                $previousCSID = "none";
                //$CSID = $name."_0";
            }
            //else{
            //            $count = explode(" ", $previousCSID);
            //            $cnt = $count[1] + 1;
            //            $CSID = $name."_".$cnt;
            //        }
            wfDebugLog('p2p', '  ->pushrequest ' . $request);
            wfDebugLog('p2p', '  ->pushHead : ' . $previousCSID);
            $CSID = utils::generateID();
            //changesetID
            if ($request == false) {
                $outtext = '<p><b>No semantic request found!</b></p> <a href="' . $_SERVER['HTTP_REFERER'] . '">back</a>';
                $wgOut->addHTML($outtext);
                return false;
            }
            $pages = getRequestedPages($request);
            //ce sont des pages et non des patches
            foreach ($pages as $page) {
                wfDebugLog('p2p', '  ->requested page ' . $page);
                $page = str_replace('"', '', $page);
                $request1 = '[[Patch:+]][[onPage::' . $page . ']]';
                $tmpPatches = utils::orderPatchByPrevious($page);
                if (!is_array($tmpPatches)) {
                    throw new MWException(__METHOD__ . ': $tmpPatches is not an array');
                }
                $patches = array_merge($patches, $tmpPatches);
                wfDebugLog('p2p', '  -> ' . count($tmpPatches) . 'patchs were found for the page ' . $page);
            }
            wfDebugLog('p2p', '  -> ' . count($patches) . ' patchs were found for the pushfeed ' . $name);
            $published = getPublishedPatches($name);
            $unpublished = array_diff($patches, $published);
            /* unpublished = patches-published */
            wfDebugLog('p2p', '  -> ' . count($published) . ' patchs were published for the pushfeed ' . $name . ' and ' . count($unpublished) . ' unpublished patchs');
            if (empty($unpublished)) {
                wfDebugLog('p2p', '  -> no unpublished patch');
                utils::writeAndFlush("<span style=\"margin-left:60px;\">no unpublished patch</span><br/>");
                //return false; //If there is no unpublished patch
            } else {
                utils::writeAndFlush("<span style=\"margin-left:60px;\">" . count($unpublished) . " unpublished patch</span><br/>");
                $pos = strrpos($CSID, ":");
                //NS removing
                if ($pos === false) {
                    // not found...
                    $articleName = $CSID;
                    $CSID = "ChangeSet:" . $articleName;
                } else {
                    $articleName = substr($CSID, 0, $pos + 1);
                    $CSID = "ChangeSet:" . $articleName;
                }
                $newtext = "\n[[Special:ArticleAdminPage|DSMW Admin functions]]\n\n==Features==\n[[changeSetID::" . $CSID . "| ]]\n\n'''Date:''' " . date(DATE_RFC822) . "\n\n'''User:''' " . $wgUser->getName() . "\n\nThis ChangeSet is in : [[inPushFeed::" . $name . "]]<br>\n==Published patches==\n\n{| class=\"wikitable\" border=\"1\" style=\"text-align:left; width:30%;\"\n|-\n!bgcolor=#c0e8f0 scope=col | Patch\n|-\n";
                //wfDebugLog('p2p','  -> count unpublished patch '.count($unpublished));
                foreach ($unpublished as $patch) {
                    wfDebugLog('p2p', '  -> unpublished patch ' . $patch);
                    $newtext .= "|[[hasPatch::" . $patch . "]]\n|-\n";
                }
                $newtext .= "\n|}";
                $newtext .= "\n==Previous ChangeSet==\n[[previousChangeSet::" . $previousCSID . "]]\n";
                $update = updatePushFeed($name, $CSID);
                if ($update == true) {
                    // update the "hasPushHead" value successful
                    $title = Title::newFromText($articleName, CHANGESET);
                    $article = new Article($title);
                    $article->doEdit($newtext, $summary = "");
                } else {
                    $outtext = '<p><b>PushFeed has not been updated!</b></p>';
                    $wgOut->addHTML($outtext);
                }
            }
        }
        //end foreach pushfeed list
        utils::writeAndFlush('<p><b>End push</b></p>');
        $title = Title::newFromText('Special:ArticleAdminPage');
        $article = new Article($title);
        $article->doRedirect();
        return false;
    } elseif (isset($_GET['action']) && $_GET['action'] == 'pullpage') {
        //$url = rtrim($_POST['url'], "/"); //removes the final "/" if there is one
        $urlTmp = $_POST['url'];
        if (utils::isValidURL($urlTmp) == false) {
            throw new MWException(__METHOD__ . ': ' . $urlTmp . ' seems not to be an url');
        }
        //throws an exception if $url is invalid
        $res = utils::parsePushURL($urlTmp);
        if ($res === false || empty($res)) {
            throw new MWException(__METHOD__ . ': URL format problem');
        }
        $pushname = $res[0];
        $url = $res[1];
        //$pushname = $_POST['pushname'];
        $pullname = $_POST['pullname'];
        wfDebugLog('p2p', '@@@@@@@@@@@@@ Create pull ' . $pullname . ' with pushName ' . $pushname . ' on ' . $url);
        $newtext = "\n[[Special:ArticleAdminPage|DSMW Admin functions]]\n\n==Features==\n\n[[name::PullFeed:" . $pullname . "| ]]\n'''URL of the DSMW PushServer:''' [[pushFeedServer::" . $url . "]]<br>\n'''PushFeed name:''' [[pushFeedName::PushFeed:" . $pushname . "]]\n[[deleted::false| ]]\n\n==Actions==\n\n{{#input:type=ajax|value=PULL|onClick=pushpull('" . $urlServer . "','PullFeed:" . $pullname . "','onpull');}}\n\nThe \"PULL\" action gets the modifications published in the PushFeed of the PushFeedServer above.\n\n== PULL Progress : ==\n<div id=\"state\" ></div><br />\n";
        $title = Title::newFromText($pullname, PULLFEED);
        $article = new Article($title);
        $article->doEdit($newtext, $summary = "");
        $article->doRedirect();
        return false;
    } elseif (isset($_POST['action']) && $_POST['action'] == 'onpull') {
        if (isset($_POST['name'])) {
            $name1 = $_POST['name'];
            wfDebugLog('p2p', '@@@@@@@@@@@@@   pull on ');
            if (!is_array($name1)) {
                $name1 = array($name1);
            }
        } else {
            $name1 = "";
        }
        if ($name1 == "") {
            utils::writeAndFlush('<p><b>No pullfeed selected!</b></p> ');
            $title = Title::newFromText('Special:ArticleAdminPage');
            $article = new Article($title);
            $article->doEdit('', $summary = "");
            $article->doRedirect();
            return false;
        }
        //$name = $name1[0];//with NS
        utils::writeAndFlush('<p><b>Start pull</b></p>');
        foreach ($name1 as $name) {
            // for each pullfeed name==> pull
            utils::writeAndFlush("<span style=\"margin-left:30px;\">begin pull: <A HREF=" . 'http://' . $wgServerName . $wgScriptPath . "/index.php?title={$name}>" . $name . "</a></span> <br/>");
            wfDebugLog('p2p', '      -> pull : ' . $name);
            //        $previousCSID = getPreviousPulledCSID($name);
            //        if($previousCSID==false) {
            //            $previousCSID = "none";
            //        }
            $previousCSID = getHasPullHead($name);
            if ($previousCSID == false) {
                $previousCSID = "none";
            }
            wfDebugLog('p2p', '      -> pullHead : ' . $previousCSID);
            $relatedPushServer = getPushURL($name);
            if (is_null($relatedPushServer)) {
                throw new MWException(__METHOD__ . ': no relatedPushServer url');
            }
            $namePush = getPushName($name);
            $namePush = str_replace(' ', '_', $namePush);
            wfDebugLog('p2p', '      -> pushServer : ' . $relatedPushServer);
            wfDebugLog('p2p', '      -> pushName : ' . $namePush);
            if (is_null($namePush)) {
                throw new MWException(__METHOD__ . ': no PushName');
            }
            //split NS and name
            preg_match("/^(.+?)_*:_*(.*)\$/S", $namePush, $m);
            $nameWithoutNS = $m[2];
            //$url = $relatedPushServer.'/api.php?action=query&meta=changeSet&cspushName='.$nameWithoutNS.'&cschangeSet='.$previousCSID.'&format=xml';
            //$url = $relatedPushServer."/api{$wgScriptExtension}?action=query&meta=changeSet&cspushName=".$nameWithoutNS.'&cschangeSet='.$previousCSID.'&format=xml';
            wfDebugLog('testlog', '      -> request ChangeSet : ' . $relatedPushServer . '/api.php?action=query&meta=changeSet&cspushName=' . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml');
            $cs = utils::file_get_contents_curl(utils::lcfirst($relatedPushServer) . "/api.php?action=query&meta=changeSet&cspushName=" . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml');
            /* test if it is a xml file. If not, the server is not reachable via the url
             * Then we try to reach it with the .php5 extension
             */
            if (strpos($cs, "<?xml version=\"1.0\"?>") === false) {
                $cs = utils::file_get_contents_curl(utils::lcfirst($relatedPushServer) . "/api.php5?action=query&meta=changeSet&cspushName=" . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml');
            }
            if (strpos($cs, "<?xml version=\"1.0\"?>") === false) {
                $cs = false;
            }
            if ($cs === false) {
                throw new MWException(__METHOD__ . ': Cannot connect to Push Server (ChangeSet API)');
            }
            $cs = trim($cs);
            $dom = new DOMDocument();
            $dom->loadXML($cs);
            $changeSet = $dom->getElementsByTagName('changeSet');
            $CSID = null;
            $csName = null;
            foreach ($changeSet as $cs) {
                if ($cs->hasAttribute("id")) {
                    $CSID = $cs->getAttribute('id');
                    $csName = $CSID;
                }
            }
            wfDebugLog('p2p', '     -> changeSet found ' . $CSID);
            while ($CSID != null) {
                //if(!utils::pageExist($CSID)) {
                $listPatch = null;
                $patchs = $dom->getElementsByTagName('patch');
                foreach ($patchs as $p) {
                    wfDebugLog('p2p', '          -> patch ' . $p->firstChild->nodeValue);
                    $listPatch[] = $p->firstChild->nodeValue;
                }
                // $CSID = substr($CSID,strlen('changeSet:'));
                utils::createChangeSetPull($CSID, $name, $previousCSID, $listPatch);
                integrate($CSID, $listPatch, $relatedPushServer, $csName);
                updatePullFeed($name, $CSID);
                // }
                $previousCSID = $CSID;
                wfDebugLog('p2p', '      -> request ChangeSet : ' . $relatedPushServer . '/api.php?action=query&meta=changeSet&cspushName=' . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml');
                $cs = utils::file_get_contents_curl(utils::lcfirst($relatedPushServer) . "/api.php?action=query&meta=changeSet&cspushName=" . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml');
                /* test if it is a xml file. If not, the server is not reachable via the url
                 * Then we try to reach it with the .php5 extension
                 */
                if (strpos($cs, "<?xml version=\"1.0\"?>") === false) {
                    $cs = utils::file_get_contents_curl(utils::lcfirst($relatedPushServer) . "/api.php5?action=query&meta=changeSet&cspushName=" . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml');
                }
                if (strpos($cs, "<?xml version=\"1.0\"?>") === false) {
                    $cs = false;
                }
                if ($cs === false) {
                    throw new MWException(__METHOD__ . ': Cannot connect to Push Server (ChangeSet API)');
                }
                $cs = trim($cs);
                $dom = new DOMDocument();
                $dom->loadXML($cs);
                $changeSet = $dom->getElementsByTagName('changeSet');
                $CSID = null;
                foreach ($changeSet as $cs) {
                    if ($cs->hasAttribute("id")) {
                        $CSID = $cs->getAttribute('id');
                    }
                }
                wfDebugLog('p2p', '     -> changeSet found ' . $CSID);
            }
            if (is_null($csName)) {
                wfDebugLog('p2p', '  - redirect to Special:ArticleAdminPage');
                utils::writeAndFlush("<span style=\"margin-left:60px;\">no new patch</span><br/>");
            } else {
                wfDebugLog('p2p', '  - redirect to ChangeSet:' . $csName);
            }
        }
        //end foreach list pullfeed
        utils::writeAndFlush('<p><b>End pull</b></p>');
        $title = Title::newFromText('Special:ArticleAdminPage');
        $article = new Article($title);
        $article->doRedirect();
        return false;
    } else {
        return true;
    }
}