Open Journal Systems  3.3.0
PluginGalleryDAO.inc.php
1 <?php
2 
17 import('lib.pkp.classes.plugins.GalleryPlugin');
18 
19 define('PLUGIN_GALLERY_XML_URL', 'https://pkp.sfu.ca/ojs/xml/plugins.xml');
20 
21 class PluginGalleryDAO extends DAO {
22 
31  function getNewestCompatible($application, $category = null, $search = null) {
32  $doc = $this->_getDocument();
33  $plugins = array();
34  foreach ($doc->getElementsByTagName('plugin') as $element) {
35  $plugin = $this->_compatibleFromElement($element, $application);
36  // May be null if no compatible version exists; also
37  // apply search filters if any supplied.
38  if (
39  $plugin &&
40  ($category == '' || $category == PLUGIN_GALLERY_ALL_CATEGORY_SEARCH_VALUE || $plugin->getCategory() == $category) &&
41  ($search == '' || PKPString::strpos(PKPString::strtolower(serialize($plugin)), PKPString::strtolower($search)) !== false)
42  ) {
43  $plugins[] = $plugin;
44  }
45  }
46  return $plugins;
47  }
48 
53  private function _getDocument() {
54  $doc = new DOMDocument('1.0');
55  $client = Application::get()->getHttpClient();
56  $response = $client->request('GET', PLUGIN_GALLERY_XML_URL);
57  $doc->loadXML($response->getBody());
58  return $doc;
59  }
60 
65  function newDataObject() {
66  return new GalleryPlugin();
67  }
68 
76  protected function _compatibleFromElement($element, $application) {
77  $plugin = $this->newDataObject();
78  $plugin->setCategory($element->getAttribute('category'));
79  $plugin->setProduct($element->getAttribute('product'));
80  $doc = $element->ownerDocument;
81  $foundRelease = false;
82  for ($n = $element->firstChild; $n; $n=$n->nextSibling) {
83  if (!is_a($n, 'DOMElement')) continue;
84  switch ($n->tagName) {
85  case 'name':
86  $plugin->setName($n->nodeValue, $n->getAttribute('locale'));
87  break;
88  case 'homepage':
89  $plugin->setHomepage($n->nodeValue);
90  break;
91  case 'description':
92  $plugin->setDescription($n->nodeValue, $n->getAttribute('locale'));
93  break;
94  case 'installation':
95  $plugin->setInstallationInstructions($n->nodeValue, $n->getAttribute('locale'));
96  break;
97  case 'summary':
98  $plugin->setSummary($n->nodeValue, $n->getAttribute('locale'));
99  break;
100  case 'maintainer':
101  $this->_handleMaintainer($n, $plugin);
102  break;
103  case 'release':
104  // If a compatible release couldn't be
105  // found, return null.
106  if ($this->_handleRelease($n, $plugin, $application)) $foundRelease = true;
107  break;
108  default:
109  // Not erroring out here so that future
110  // additions won't break old releases.
111  }
112  }
113  if (!$foundRelease) {
114  // No compatible release was found.
115  return null;
116  }
117  return $plugin;
118  }
119 
125  function _handleMaintainer($element, $plugin) {
126  for ($n = $element->firstChild; $n; $n=$n->nextSibling) {
127  if (!is_a($n, 'DOMElement')) continue;
128  switch ($n->tagName) {
129  case 'name':
130  $plugin->setContactName($n->nodeValue);
131  break;
132  case 'institution':
133  $plugin->setContactInstitutionName($n->nodeValue);
134  break;
135  case 'email':
136  $plugin->setContactEmail($n->nodeValue);
137  break;
138  default:
139  // Not erroring out here so that future
140  // additions won't break old releases.
141  }
142  }
143  }
144 
151  function _handleRelease($element, $plugin, $application) {
152  $release = array(
153  'date' => strtotime($element->getAttribute('date')),
154  'version' => $element->getAttribute('version'),
155  'md5' => $element->getAttribute('md5'),
156  );
157 
158  $compatible = false;
159  for ($n = $element->firstChild; $n; $n=$n->nextSibling) {
160  if (!is_a($n, 'DOMElement')) continue;
161  switch ($n->tagName) {
162  case 'description':
163  $release[$n->tagName][$n->getAttribute('locale')] = $n->nodeValue;
164  break;
165  case 'package':
166  $release['package'] = $n->nodeValue;
167  break;
168  case 'compatibility':
169  // If a compatible release couldn't be
170  // found, return null.
171  if ($this->_handleCompatibility($n, $plugin, $application)) {
172  $compatible = true;
173  }
174  break;
175  case 'certification':
176  $release[$n->tagName][] = $n->getAttribute('type');
177  break;
178  default:
179  // Not erroring out here so that future
180  // additions won't break old releases.
181  }
182  }
183 
184  if ($compatible && (!$plugin->getData('version') || version_compare($plugin->getData('version'), $release['version'], '<'))) {
185  // This release is newer than the one found earlier, or
186  // this is the first compatible release we've found.
187  $plugin->setDate($release['date']);
188  $plugin->setVersion($release['version']);
189  $plugin->setReleaseMD5($release['md5']);
190  $plugin->setReleaseDescription($release['description']);
191  $plugin->setReleaseCertifications($release['certification']);
192  $plugin->setReleasePackage($release['package']);
193  return true;
194  }
195  return false;
196  }
197 
206  function _handleCompatibility($element, $plugin, $application) {
207  // Check that the compatibility statement refers to this app
208  if ($element->getAttribute('application')!=$application->getName()) return false;
209 
210  for ($n = $element->firstChild; $n; $n=$n->nextSibling) {
211  if (!is_a($n, 'DOMElement')) continue;
212  switch ($n->tagName) {
213  case 'version':
214  $installedVersion = $application->getCurrentVersion();
215  if ($installedVersion->compare($n->nodeValue)==0) {
216  // Compatibility was determined.
217  return true;
218  }
219  break;
220  }
221  }
222 
223  // No applicable compatibility statement found.
224  return false;
225  }
226 }
227 
228 
PluginGalleryDAO\_handleCompatibility
_handleCompatibility($element, $plugin, $application)
Definition: PluginGalleryDAO.inc.php:206
$application
$application
Definition: index.php:65
PluginGalleryDAO
Operations for retrieving content from the PKP plugin gallery.
Definition: PluginGalleryDAO.inc.php:21
PluginGalleryDAO\_handleMaintainer
_handleMaintainer($element, $plugin)
Definition: PluginGalleryDAO.inc.php:125
PluginGalleryDAO\_handleRelease
_handleRelease($element, $plugin, $application)
Definition: PluginGalleryDAO.inc.php:151
PKPString\strtolower
static strtolower($string)
Definition: PKPString.inc.php:169
PluginGalleryDAO\_compatibleFromElement
_compatibleFromElement($element, $application)
Definition: PluginGalleryDAO.inc.php:76
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
PKPString\strpos
static strpos($haystack, $needle, $offset=0)
Definition: PKPString.inc.php:139
PluginGalleryDAO\getNewestCompatible
getNewestCompatible($application, $category=null, $search=null)
Definition: PluginGalleryDAO.inc.php:31
GalleryPlugin
Class describing a plugin in the Plugin Gallery.
Definition: GalleryPlugin.inc.php:22
DAO
Operations for retrieving and modifying objects from a database.
Definition: DAO.inc.php:31
PluginGalleryDAO\newDataObject
newDataObject()
Definition: PluginGalleryDAO.inc.php:65