Subversion Repositories Applications.gtt

Rev

Rev 94 | Details | Compare with Previous | Last modification | View Log | RSS feed

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