DumpCliContent::validateInput()   B
last analyzed

Complexity

Conditions 7
Paths 9

Size

Total Lines 50

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
nc 9
nop 1
dl 0
loc 50
rs 8.1575
c 0
b 0
f 0
1
<?php
2
/**
3
 * @author stev leibelt <[email protected]>
4
 * @since 2015-07-11
5
 * @see https://github.com/stevleibelt/examples/blob/master/php/filesystem/makePathsRelativeToEachOther.php
6
 */
7
8
namespace NetBazzlineZfCliGenerator\Service\ProcessPipe\Transformer;
9
10
use Net\Bazzline\Component\ProcessPipe\ExecutableException;
11
use Net\Bazzline\Component\ProcessPipe\ExecutableInterface;
12
use Symfony\Component\Filesystem\Filesystem;
13
14
class DumpCliContent implements ExecutableInterface
15
{
16
    const INPUT_KEY_PATH_TO_APPLICATION     = 'path_to_application';
17
    const INPUT_KEY_PATH_TO_AUTOLOAD        = 'path_to_autoload';
18
    const INPUT_KEY_PATH_TO_CLI             = 'path_to_cli';
19
    const INPUT_KEY_PATH_TO_CONFIGURATION   = 'path_to_configuration';
20
    const INPUT_KEY_PREFIX_CLI              = 'prefix_cli';
21
22
    /** @var Filesystem */
23
    private $filesystem;
24
25
    /** @var int */
26
    private $timestamp;
27
28
    /**
29
     * @param Filesystem $filesystem
30
     */
31
    public function setFilesystem(Filesystem $filesystem)
32
    {
33
        $this->filesystem = $filesystem;
34
    }
35
36
    /**
37
     * @param int $timestamp
38
     */
39
    public function setTimestamp($timestamp)
40
    {
41
        $this->timestamp = $timestamp;
42
    }
43
44
    /**
45
     * @param mixed $input
46
     * @return mixed
47
     * @throws ExecutableException
48
     */
49
    public function execute($input = null)
50
    {
51
        $this->validateInput($input);
52
53
        $date                   = date('Y-m-d H:i:s');
54
        $filesystem             = $this->filesystem;
55
        $pathToApplication      = $input[self::INPUT_KEY_PATH_TO_APPLICATION];
56
        $pathToAutoload         = $input[self::INPUT_KEY_PATH_TO_AUTOLOAD];
57
        $pathToConfiguration    = $input[self::INPUT_KEY_PATH_TO_CONFIGURATION];
58
        $pathToCli              = dirname($input[self::INPUT_KEY_PATH_TO_CLI]);
59
        $prefix                 = $input[self::INPUT_KEY_PREFIX_CLI];
60
61
        $pathFromCliToAutoload      = DIRECTORY_SEPARATOR . $filesystem->makePathRelative($pathToAutoload, $pathToCli);
62
        $pathFromCliToApplication   = DIRECTORY_SEPARATOR . $filesystem->makePathRelative($pathToApplication, $pathToCli);
63
        $pathFromCliToConfiguration = DIRECTORY_SEPARATOR . $filesystem->makePathRelative($pathToConfiguration, $pathToCli);
64
65
        //@todo a bug in symfony filesystem?
66
        $pathFromCliToAutoload      = substr($pathFromCliToAutoload, 0, -1);
67
        $pathFromCliToApplication   = substr($pathFromCliToApplication, 0, -1);
68
        $pathFromCliToConfiguration = substr($pathFromCliToConfiguration, 0, -1);
69
70
        $output = <<<EOC
71
#!/usr/bin/env php
72
<?php
73
/**
74
 * @author Net\Bazzline Zf Cli Generator
75
 * @since $date
76
 */
77
78
use Net\Bazzline\Component\Cli\Readline\ManagerFactory;
79
80
require_once __DIR__ . '$pathFromCliToAutoload';
81
82
try {
83
    \$factory           = new ManagerFactory();
84
    \$manager           = \$factory->create();
85
    \$callApplication   = function() {
86
        \$line       = readline_info('line_buffer');
87
        \$command    = '/usr/bin/env php ' .
88
            __DIR__ . '$pathFromCliToApplication ' .
89
            \$line;
90
91
        passthru(\$command);
92
    };
93
    \$configuration     = require_once(__DIR__ . '$pathFromCliToConfiguration');
94
95
    \$manager->setConfiguration(\$configuration);
96
    \$manager->setPrompt('$prefix');
97
    \$manager->run();
98
} catch (Exception \$exception) {
99
    echo '----------------' . PHP_EOL;
100
    echo \$exception->getMessage() . PHP_EOL;
101
    return 1;
102
}
103
EOC;
104
105
        return $output;
106
    }
107
108
    /**
109
     * @param mixed $input
110
     * @throws ExecutableException
111
     */
112
    private function validateInput(&$input)
113
    {
114
        if (!is_array($input)) {
115
            throw new ExecutableException(
116
                'input must be an array'
117
            );
118
        }
119
120
        if (empty($input)) {
121
            throw new ExecutableException(
122
                'empty input provided'
123
            );
124
        }
125
126
        $keys = array(
127
            self::INPUT_KEY_PATH_TO_APPLICATION,
128
            self::INPUT_KEY_PATH_TO_AUTOLOAD,
129
            self::INPUT_KEY_PATH_TO_CONFIGURATION,
130
            self::INPUT_KEY_PATH_TO_CLI,
131
            self::INPUT_KEY_PREFIX_CLI
132
        );
133
134
        foreach ($keys as $key) {
135
            if (!isset($input[$key])) {
136
                throw new ExecutableException(
137
                    'input must contain mandatory key "' . $key . '"'
138
                );
139
            }
140
        }
141
142
        //validate paths
143
        $paths = array(
144
            self::INPUT_KEY_PATH_TO_APPLICATION,
145
            self::INPUT_KEY_PATH_TO_AUTOLOAD,
146
            self::INPUT_KEY_PATH_TO_CLI,
147
            self::INPUT_KEY_PATH_TO_CONFIGURATION
148
        );
149
150
        foreach ($paths as $path) {
151
            $realPath = realpath($input[$path]);
152
153
            if ($realPath === false) {
154
                throw new ExecutableException(
155
                    'provided path is not a real path / does not exist "' . $input[$path] . '"'
156
                );
157
            } else {
158
                $input[$path] = $realPath;
159
            }
160
        }
161
    }
162
}
163