3 * @copyright Copyright (c) Xerox Corporation, Codendi 2007-2008.
4 * Copyright (C) 2010-2011 Alain Peyrat - Alcatel-Lucent
6 * This file is licensed under the GNU General Public License version 2. See the file COPYING.
8 * @author Marc Nazarian <marc.nazarian@xrce.xerox.com>
13 require_once 'PluginHudsonJobDao.class.php';
15 class hudsonPlugin extends Plugin {
17 function hudsonPlugin($id=0) {
19 $this->name = "hudson";
20 $this->text = _('Hudson/Jenkins'); // To show in the tabs, use...
21 $this->_addHook("user_personal_links"); //to make a link to the user's personal part of the plugin
22 $this->_addHook("usermenu") ;
23 $this->_addHook("groupmenu"); // To put into the project tabs
24 $this->_addHook("groupisactivecheckbox") ; // The "use ..." checkbox in editgroupinfo
25 $this->_addHook("groupisactivecheckboxpost") ; //
26 $this->_addHook("userisactivecheckbox") ; // The "use ..." checkbox in user account
27 $this->_addHook("userisactivecheckboxpost") ; //
28 $this->_addHook("project_admin_plugins"); // to show up in the admin page fro group
29 $this->_addHook('javascript', false);
30 $this->_addHook('cssfile', 'cssFile', false);
32 $this->_addHook('project_is_deleted', 'projectIsDeleted', false);
34 $this->_addHook('widget_instance', 'myPageBox', false);
35 $this->_addHook('widgets', 'widgets', false);
37 $this->_addHook('get_available_reference_natures', 'getAvailableReferenceNatures', false);
38 $this->_addHook('ajax_reference_tooltip', 'ajax_reference_tooltip', false);
40 function CallHook ($hookname, &$params) {
41 global $G_SESSION,$HTML;
42 if ($hookname == "usermenu") {
43 $text = $this->text; // this is what shows in the tab
44 if ($G_SESSION->usesPlugin("hudson")) {
45 $param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
46 echo ' | ' . $HTML->PrintSubMenu (array ($text),
47 array ('/plugins/hudson/index.php' . $param ));
49 } elseif ($hookname == "groupmenu") {
50 $group_id=$params['group'];
51 $project = group_get_object($group_id);
52 if (!$project || !is_object($project)) {
55 if ($project->isError()) {
58 if (!$project->isProject()) {
61 if ( $project->usesPlugin( $this->name )) {
62 $params['TITLES'][] = $this->text;
63 $params['DIRS'][] = '/plugins/hudson/index.php?group_id=' . $group_id . "&pluginname=" . $this->name; // we indicate the part we're calling is the project one
64 $params['ADMIN'][] = '';
65 $params['TOOLTIPS'][] = _('Continuus Integration Scheduler');
67 if (isset($params['toptab'])) {
68 (($params['toptab'] == $this->name) ? $params['selected']=(count($params['TITLES'])-1) : '' );
70 } elseif ($hookname =='cssfile') {
71 use_stylesheet('/plugins/hudson/themes/default/css/style.css');
72 } elseif ($hookname == "cssfile") {
73 $this->cssFile($params);
74 } elseif ($hookname == "project_is_deleted") {
75 $this->projectIsDeleted($params);
76 } elseif ($hookname == "widget_instance") {
77 $this->myPageBox($params);
78 } elseif ($hookname == "widgets") {
79 $this->widgets($params);
80 } elseif ($hookname == "get_available_reference_natures") {
81 $this->getAvailableReferenceNatures($params);
82 } elseif ($hookname == "ajax_reference_tooltip") {
83 $this->ajax_reference_tooltip($params);
88 function &getPluginInfo() {
89 if (!is_a($this->pluginInfo, 'hudsonPluginInfo')) {
90 require_once 'hudsonPluginInfo.class.php';
91 $this->pluginInfo = new hudsonPluginInfo($this);
93 return $this->pluginInfo;
96 function cssFile($params) {
97 // Only show the stylesheet if we're actually in the hudson pages.
98 // This stops styles inadvertently clashing with the main site.
99 if (strpos($_SERVER['REQUEST_URI'], $this->getPluginPath()) === 0 ||
100 strpos($_SERVER['REQUEST_URI'], '/my/') === 0 ||
101 strpos($_SERVER['REQUEST_URI'], '/projects/') === 0 ||
102 strpos($_SERVER['REQUEST_URI'], '/widgets/') === 0
104 use_stylesheet($this->getThemePath().'/css/style.css');
109 * When a project is deleted,
110 * we delete all the hudson jobs of this project
112 * @param mixed $params ($param['group_id'] the ID of the deleted project)
114 function projectIsDeleted($params) {
115 $group_id = $params['group_id'];
116 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
117 $dar = $job_dao->deleteHudsonJobsByGroupID($group_id);
120 function myPageBox($params) {
121 require_once 'common/widget/WidgetLayoutManager.class.php';
123 $user = UserManager::instance()->getCurrentUser();
126 if ($params['widget'] == 'plugin_hudson_my_jobs') {
127 require_once 'hudson_Widget_MyMonitoredJobs.class.php';
128 $params['instance'] = new hudson_Widget_MyMonitoredJobs($this);
130 if ($params['widget'] == 'plugin_hudson_my_joblastbuilds') {
131 require_once 'hudson_Widget_JobLastBuilds.class.php';
132 $params['instance'] = new hudson_Widget_JobLastBuilds(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
134 if ($params['widget'] == 'plugin_hudson_my_jobtestresults') {
135 require_once 'hudson_Widget_JobTestResults.class.php';
136 $params['instance'] = new hudson_Widget_JobTestResults(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
138 if ($params['widget'] == 'plugin_hudson_my_jobtesttrend') {
139 require_once 'hudson_Widget_JobTestTrend.class.php';
140 $params['instance'] = new hudson_Widget_JobTestTrend(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
142 if ($params['widget'] == 'plugin_hudson_my_jobbuildhistory') {
143 require_once 'hudson_Widget_JobBuildHistory.class.php';
144 $params['instance'] = new hudson_Widget_JobBuildHistory(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
146 if ($params['widget'] == 'plugin_hudson_my_joblastartifacts') {
147 require_once 'hudson_Widget_JobLastArtifacts.class.php';
148 $params['instance'] = new hudson_Widget_JobLastArtifacts(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
152 if ($params['widget'] == 'plugin_hudson_project_jobsoverview') {
153 require_once 'hudson_Widget_ProjectJobsOverview.class.php';
154 $params['instance'] = new hudson_Widget_ProjectJobsOverview($this);
156 if ($params['widget'] == 'plugin_hudson_project_joblastbuilds') {
157 require_once 'hudson_Widget_JobLastBuilds.class.php';
158 $params['instance'] = new hudson_Widget_JobLastBuilds(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
160 if ($params['widget'] == 'plugin_hudson_project_jobtestresults') {
161 require_once 'hudson_Widget_JobTestResults.class.php';
162 $params['instance'] = new hudson_Widget_JobTestResults(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
164 if ($params['widget'] == 'plugin_hudson_project_jobtesttrend') {
165 require_once 'hudson_Widget_JobTestTrend.class.php';
166 $params['instance'] = new hudson_Widget_JobTestTrend(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
168 if ($params['widget'] == 'plugin_hudson_project_jobbuildhistory') {
169 require_once 'hudson_Widget_JobBuildHistory.class.php';
170 $params['instance'] = new hudson_Widget_JobBuildHistory(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
172 if ($params['widget'] == 'plugin_hudson_project_joblastartifacts') {
173 require_once 'hudson_Widget_JobLastArtifacts.class.php';
174 $params['instance'] = new hudson_Widget_JobLastArtifacts(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
177 function widgets($params) {
178 $group = group_get_object($GLOBALS['group_id']);
179 if ( !$group || !$group->usesPlugin ( $this->name ) ) {
183 require_once 'common/widget/WidgetLayoutManager.class.php';
184 if ($params['owner_type'] == WidgetLayoutManager::OWNER_TYPE_USER) {
185 $params['codendi_widgets'][] = 'plugin_hudson_my_jobs';
186 $params['codendi_widgets'][] = 'plugin_hudson_my_joblastbuilds';
187 $params['codendi_widgets'][] = 'plugin_hudson_my_jobtestresults';
188 $params['codendi_widgets'][] = 'plugin_hudson_my_jobtesttrend';
189 $params['codendi_widgets'][] = 'plugin_hudson_my_jobbuildhistory';
190 $params['codendi_widgets'][] = 'plugin_hudson_my_joblastartifacts';
192 if ($params['owner_type'] == WidgetLayoutManager::OWNER_TYPE_GROUP) {
193 $params['codendi_widgets'][] = 'plugin_hudson_project_jobsoverview';
194 $params['codendi_widgets'][] = 'plugin_hudson_project_joblastbuilds';
195 $params['codendi_widgets'][] = 'plugin_hudson_project_jobtestresults';
196 $params['codendi_widgets'][] = 'plugin_hudson_project_jobtesttrend';
197 $params['codendi_widgets'][] = 'plugin_hudson_project_jobbuildhistory';
198 $params['codendi_widgets'][] = 'plugin_hudson_project_joblastartifacts';
202 function getAvailableReferenceNatures($params) {
203 $hudson_plugin_reference_natures = array(
204 'hudson_build' => array('keyword' => 'build', 'label' => _("Hudson Build")),
205 'hudson_job' => array('keyword' => 'job', 'label' => _("Hudson Job")));
206 $params['natures'] = array_merge($params['natures'], $hudson_plugin_reference_natures);
209 function ajax_reference_tooltip($params) {
210 require_once 'HudsonJob.class.php';
211 require_once 'HudsonBuild.class.php';
212 require_once 'hudson_Widget_JobLastBuilds.class.php';
214 $ref = $params['reference'];
215 switch ($ref->getNature()) {
217 $val = $params['val'];
218 $group_id = $params['group_id'];
219 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
220 if (strpos($val, "/") !== false) {
221 $arr = explode("/", $val);
224 $dar = $job_dao->searchByJobName($job_name, $group_id);
227 $dar = $job_dao->searchByGroupID($group_id);
228 if ($dar->rowCount() != 1) {
232 if ($dar && $dar->valid()) {
233 $row = $dar->current();
234 $build = new HudsonBuild($row['job_url'].'/'.$build_id.'/');
235 echo '<strong>' . _("Build performed on:") . '</strong> ' . $build->getBuildTime() . '<br />';
236 echo '<strong>' . _("Status:") . '</strong> ' . $build->getResult();
238 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
242 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
243 $job_name = $params['val'];
244 $group_id = $params['group_id'];
245 $dar = $job_dao->searchByJobName($job_name, $group_id);
247 $row = $dar->current();
249 $job = new HudsonJob($row['job_url']);
250 $job_id = $row['job_id'];
254 $html .= ' <td colspan="2">';
255 $html .= ' '.$job->getName().': <img src="'.$job->getStatusIcon().'" />';
261 if ($job->hasBuilds()) {
262 $html .= ' <li>'._("Last Build:").' <a href="/plugins/hudson/?action=view_build&group_id='.$group_id.'&job_id='.$job_id.'&build_id='.$job->getLastBuildNumber().'"># '.$job->getLastBuildNumber().'</a></li>';
263 $html .= ' <li>'._("Last Success:").' <a href="/plugins/hudson/?action=view_build&group_id='.$group_id.'&job_id='.$job_id.'&build_id='.$job->getLastSuccessfulBuildNumber().'"># '.$job->getLastSuccessfulBuildNumber().'</a></li>';
264 $html .= ' <li>'._("Last Failure:").' <a href="/plugins/hudson/?action=view_build&group_id='.$group_id.'&job_id='.$job_id.'&build_id='.$job->getLastFailedBuildNumber().'"># '.$job->getLastFailedBuildNumber().'</a></li>';
266 $html .= ' <li>'. _("No build found for this job.") . '</li>';
270 $html .= ' <td class="widget_lastbuilds_weather">';
271 $html .= _("Weather Report:").'<img src="'.$job->getWeatherReportIcon().'" align="middle" />';
276 } catch (Exception $e) {
279 echo '<span class="error">'._("Error: Hudson object not found.").'</span>';
286 require_once 'hudson.class.php';
287 $controler = new hudson();
288 $controler->process();