source: trunk/library/PEAR/PEAR/Installer/Role.php @ 5146

Revision 5146, 7.8 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2305 - Enviando alteracoes, desenvolvidas internamente na Prognus. Library: adicionando arquivos.

Line 
1<?php
2/**
3 * PEAR_Installer_Role
4 *
5 * PHP versions 4 and 5
6 *
7 * @category   pear
8 * @package    PEAR
9 * @author     Greg Beaver <cellog@php.net>
10 * @copyright  1997-2009 The Authors
11 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
12 * @version    CVS: $Id: Role.php 313023 2011-07-06 19:17:11Z dufuz $
13 * @link       http://pear.php.net/package/PEAR
14 * @since      File available since Release 1.4.0a1
15 */
16
17/**
18 * base class for installer roles
19 */
20require_once 'PEAR/Installer/Role/Common.php';
21require_once 'PEAR/XMLParser.php';
22/**
23 * @category   pear
24 * @package    PEAR
25 * @author     Greg Beaver <cellog@php.net>
26 * @copyright  1997-2009 The Authors
27 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
28 * @version    Release: 1.9.4
29 * @link       http://pear.php.net/package/PEAR
30 * @since      Class available since Release 1.4.0a1
31 */
32class PEAR_Installer_Role
33{
34    /**
35     * Set up any additional configuration variables that file roles require
36     *
37     * Never call this directly, it is called by the PEAR_Config constructor
38     * @param PEAR_Config
39     * @access private
40     * @static
41     */
42    function initializeConfig(&$config)
43    {
44        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
45            PEAR_Installer_Role::registerRoles();
46        }
47
48        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $class => $info) {
49            if (!$info['config_vars']) {
50                continue;
51            }
52
53            $config->_addConfigVars($class, $info['config_vars']);
54        }
55    }
56
57    /**
58     * @param PEAR_PackageFile_v2
59     * @param string role name
60     * @param PEAR_Config
61     * @return PEAR_Installer_Role_Common
62     * @static
63     */
64    function &factory($pkg, $role, &$config)
65    {
66        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
67            PEAR_Installer_Role::registerRoles();
68        }
69
70        if (!in_array($role, PEAR_Installer_Role::getValidRoles($pkg->getPackageType()))) {
71            $a = false;
72            return $a;
73        }
74
75        $a = 'PEAR_Installer_Role_' . ucfirst($role);
76        if (!class_exists($a)) {
77            require_once str_replace('_', '/', $a) . '.php';
78        }
79
80        $b = new $a($config);
81        return $b;
82    }
83
84    /**
85     * Get a list of file roles that are valid for the particular release type.
86     *
87     * For instance, src files serve no purpose in regular php releases.
88     * @param string
89     * @param bool clear cache
90     * @return array
91     * @static
92     */
93    function getValidRoles($release, $clear = false)
94    {
95        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
96            PEAR_Installer_Role::registerRoles();
97        }
98
99        static $ret = array();
100        if ($clear) {
101            $ret = array();
102        }
103
104        if (isset($ret[$release])) {
105            return $ret[$release];
106        }
107
108        $ret[$release] = array();
109        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
110            if (in_array($release, $okreleases['releasetypes'])) {
111                $ret[$release][] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
112            }
113        }
114
115        return $ret[$release];
116    }
117
118    /**
119     * Get a list of roles that require their files to be installed
120     *
121     * Most roles must be installed, but src and package roles, for instance
122     * are pseudo-roles.  src files are compiled into a new extension.  Package
123     * roles are actually fully bundled releases of a package
124     * @param bool clear cache
125     * @return array
126     * @static
127     */
128    function getInstallableRoles($clear = false)
129    {
130        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
131            PEAR_Installer_Role::registerRoles();
132        }
133
134        static $ret;
135        if ($clear) {
136            unset($ret);
137        }
138
139        if (isset($ret)) {
140            return $ret;
141        }
142
143        $ret = array();
144        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
145            if ($okreleases['installable']) {
146                $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
147            }
148        }
149
150        return $ret;
151    }
152
153    /**
154     * Return an array of roles that are affected by the baseinstalldir attribute
155     *
156     * Most roles ignore this attribute, and instead install directly into:
157     * PackageName/filepath
158     * so a tests file tests/file.phpt is installed into PackageName/tests/filepath.php
159     * @param bool clear cache
160     * @return array
161     * @static
162     */
163    function getBaseinstallRoles($clear = false)
164    {
165        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
166            PEAR_Installer_Role::registerRoles();
167        }
168
169        static $ret;
170        if ($clear) {
171            unset($ret);
172        }
173
174        if (isset($ret)) {
175            return $ret;
176        }
177
178        $ret = array();
179        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
180            if ($okreleases['honorsbaseinstall']) {
181                $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
182            }
183        }
184
185        return $ret;
186    }
187
188    /**
189     * Return an array of file roles that should be analyzed for PHP content at package time,
190     * like the "php" role.
191     * @param bool clear cache
192     * @return array
193     * @static
194     */
195    function getPhpRoles($clear = false)
196    {
197        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
198            PEAR_Installer_Role::registerRoles();
199        }
200
201        static $ret;
202        if ($clear) {
203            unset($ret);
204        }
205
206        if (isset($ret)) {
207            return $ret;
208        }
209
210        $ret = array();
211        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
212            if ($okreleases['phpfile']) {
213                $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
214            }
215        }
216
217        return $ret;
218    }
219
220    /**
221     * Scan through the Command directory looking for classes
222     * and see what commands they implement.
223     * @param string which directory to look for classes, defaults to
224     *               the Installer/Roles subdirectory of
225     *               the directory from where this file (__FILE__) is
226     *               included.
227     *
228     * @return bool TRUE on success, a PEAR error on failure
229     * @access public
230     * @static
231     */
232    function registerRoles($dir = null)
233    {
234        $GLOBALS['_PEAR_INSTALLER_ROLES'] = array();
235        $parser = new PEAR_XMLParser;
236        if ($dir === null) {
237            $dir = dirname(__FILE__) . '/Role';
238        }
239
240        if (!file_exists($dir) || !is_dir($dir)) {
241            return PEAR::raiseError("registerRoles: opendir($dir) failed: does not exist/is not directory");
242        }
243
244        $dp = @opendir($dir);
245        if (empty($dp)) {
246            return PEAR::raiseError("registerRoles: opendir($dir) failed: $php_errmsg");
247        }
248
249        while ($entry = readdir($dp)) {
250            if ($entry{0} == '.' || substr($entry, -4) != '.xml') {
251                continue;
252            }
253
254            $class = "PEAR_Installer_Role_".substr($entry, 0, -4);
255            // List of roles
256            if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'][$class])) {
257                $file = "$dir/$entry";
258                $parser->parse(file_get_contents($file));
259                $data = $parser->getData();
260                if (!is_array($data['releasetypes'])) {
261                    $data['releasetypes'] = array($data['releasetypes']);
262                }
263
264                $GLOBALS['_PEAR_INSTALLER_ROLES'][$class] = $data;
265            }
266        }
267
268        closedir($dp);
269        ksort($GLOBALS['_PEAR_INSTALLER_ROLES']);
270        PEAR_Installer_Role::getBaseinstallRoles(true);
271        PEAR_Installer_Role::getInstallableRoles(true);
272        PEAR_Installer_Role::getPhpRoles(true);
273        PEAR_Installer_Role::getValidRoles('****', true);
274        return true;
275    }
276}
Note: See TracBrowser for help on using the repository browser.