1: <?php
2:
3: namespace Himedia\Padocc\Task\Base;
4:
5: use Himedia\Padocc\AttributeProperties;
6: use Himedia\Padocc\Task;
7:
8: /**
9: * Permet de générer des fichiers sur la base de templates texte incluant des propriétés.
10: * Exemple, ici PHP :
11: * <?php
12: * define('DEPLOY_PROJECT', '${PROJECT_NAME}');
13: * define('DEPLOY_ENV', '${ENVIRONMENT_NAME}');
14: * define('DEPLOY_EXECUTION_ID', '${EXECUTION_ID}');
15: * define('TWENGABUILD', '${EXECUTION_ID}');
16: * define('DEPLOY_BASEDIR', '${BASEDIR}');
17: * Ce qui génèrera pour cet exemple :
18: * <?php
19: * define('DEPLOY_PROJECT', 'front');
20: * define('DEPLOY_ENV', 'prod');
21: * define('DEPLOY_EXECUTION_ID', '20111221154051_01652');
22: * define('TWENGABUILD', '20111221154051_01652');
23: * define('DEPLOY_BASEDIR', '/home/httpd/www.twenga');
24: *
25: * N'importe quelle propriété y est adressable : celles de master_synchro.cfg si chargé,
26: * celles provenant des tags property et celles venant des externalproperty.
27: * À inclure dans une tâche env ou target.
28: *
29: * Exemple :
30: * <filltemplate
31: * srcfile="${TMPDIR}/inc/deploy_config-template.inc.php"
32: * destfile="${TMPDIR}/inc/deploy_config.inc.php"
33: * />
34: *
35: * @author Geoffroy AUBRY <gaubry@hi-media.com>
36: */
37: class FillTemplate extends Task
38: {
39: /**
40: * {@inheritdoc}
41: */
42: protected function init()
43: {
44: parent::init();
45:
46: $this->aAttrProperties = array(
47: 'srcfile' => AttributeProperties::ALLOW_PARAMETER | AttributeProperties::REQUIRED
48: | AttributeProperties::FILE,
49: 'destfile' => AttributeProperties::ALLOW_PARAMETER | AttributeProperties::REQUIRED
50: | AttributeProperties::FILE,
51: );
52: }
53:
54: /**
55: * {@inheritdoc}
56: * @codeCoverageIgnore
57: */
58: public static function getTagName ()
59: {
60: return 'filltemplate';
61: }
62:
63: /**
64: * Vérifie au moyen de tests basiques que la tâche peut être exécutée.
65: * Lance une exception si tel n'est pas le cas.
66: *
67: * Comme toute les tâches sont vérifiées avant que la première ne soit exécutée,
68: * doit permettre de remonter au plus tôt tout dysfonctionnement.
69: * Appelé avant la méthode execute().
70: *
71: * @throws \UnexpectedValueException en cas d'attribut ou fichier manquant
72: * @throws \DomainException en cas de valeur non permise
73: */
74: public function check ()
75: {
76: parent::check();
77:
78: // Pour l'instant ne gère pas les chemins distants :
79: list($bIsSrcRemote, , ) = $this->oShell->isRemotePath($this->aAttValues['srcfile']);
80: list($bIsDestRemote, , ) = $this->oShell->isRemotePath($this->aAttValues['destfile']);
81: if ($bIsSrcRemote || $bIsDestRemote) {
82: throw new \DomainException('Remote paths not yet handled.');
83: }
84: }
85:
86: /**
87: * Phase de traitements centraux de l'exécution de la tâche.
88: * Elle devrait systématiquement commencer par "parent::centralExecute();".
89: * Appelé par execute().
90: * @see execute()
91: */
92: protected function centralExecute ()
93: {
94: parent::centralExecute();
95: $sMsg = "+++Generate '" . $this->aAttValues['destfile'] . "' from '" . $this->aAttValues['srcfile'] . "'.";
96: $this->getLogger()->info($sMsg);
97:
98: $sSrcFile = $this->processSimplePath($this->aAttValues['srcfile']);
99: $sDestFile = $this->processSimplePath($this->aAttValues['destfile']);
100: $sContent = file_get_contents($sSrcFile);
101:
102: preg_match_all('/\$\{[^}]+\}/i', $sContent, $aMatches);
103: $aParameters = array_unique($aMatches[0]);
104: $aValues = array();
105: foreach ($aParameters as $sParameter) {
106: try {
107: $sValue = $this->oProperties->getProperty(substr($sParameter, 2, -1));
108: $aValues[] = addslashes($sValue);
109: } catch (\UnexpectedValueException $oException) {
110: $aValues[] = $sParameter;
111: $sMsg = "[WARNING] Parameter '$sParameter' not resolved in '$sSrcFile' ("
112: . $oException->getMessage() . ").";
113: $this->getLogger()->warning($sMsg);
114: }
115: }
116: $sContent = str_replace($aParameters, $aValues, $sContent);
117: file_put_contents($sDestFile, $sContent);
118:
119: $this->getLogger()->info('---');
120: }
121: }
122: