3 use Wikimedia\RequestTimeout\TimeoutException;
69 $xml = file_get_contents(
$file );
71 if ( $xml ===
false ) {
72 throw new RuntimeException(
'Failed to read ' .
$file .
'!' );
84 $document =
new DOMDocument();
86 $oldLibXmlErrors = libxml_use_internal_errors(
true );
88 $oldDisable = @libxml_disable_entity_loader(
true );
89 $ok = $document->loadXML( $xml, LIBXML_NONET );
92 $errors = libxml_get_errors();
93 libxml_use_internal_errors( $oldLibXmlErrors );
95 @libxml_disable_entity_loader( $oldDisable );
97 foreach ( $errors as $error ) {
99 throw new InvalidArgumentException(
100 'Malformed XML: ' . $error->message .
' in line ' . $error->line
104 throw new InvalidArgumentException(
'Malformed XML!' );
107 libxml_use_internal_errors( $oldLibXmlErrors );
109 @libxml_disable_entity_loader( $oldDisable );
118 $this->store->saveSites( $sites );
131 $oldSites = $this->store->getSites();
133 $current = $root->firstChild;
135 if ( $current instanceof DOMElement && $current->tagName ===
'site' ) {
137 $site = $this->
makeSite( $current );
138 $key = $site->getGlobalId();
140 if ( $oldSites->hasSite( $key ) ) {
141 $oldSite = $oldSites->getSite( $key );
142 $site->setInternalId( $oldSite->getInternalId() );
145 $sites[$key] = $site;
146 }
catch ( TimeoutException $e ) {
148 }
catch ( Exception $ex ) {
153 $current = $current->nextSibling;
165 public function makeSite( DOMElement $siteElement ) {
166 if ( $siteElement->tagName !==
'site' ) {
167 throw new InvalidArgumentException(
'Expected <site> tag, found ' . $siteElement->tagName );
173 $site->setForward( $this->
hasChild( $siteElement,
'forward' ) );
174 $site->setGlobalId( $this->
getChildText( $siteElement,
'globalid' ) );
178 $pathTags = $siteElement->getElementsByTagName(
'path' );
179 for ( $i = 0; $i < $pathTags->length; $i++ ) {
180 $pathElement = $pathTags->item( $i );
181 '@phan-var DOMElement $pathElement';
183 $path = $pathElement->textContent;
185 $site->setPath( $pathType,
$path );
188 $idTags = $siteElement->getElementsByTagName(
'localid' );
189 for ( $i = 0; $i < $idTags->length; $i++ ) {
190 $idElement = $idTags->item( $i );
191 '@phan-var DOMElement $idElement';
193 $id = $idElement->textContent;
195 $site->addLocalId( $idType, $id );
213 $node = $element->getAttributeNode( $name );
216 if ( $default !==
false ) {
220 'Required ' . $name .
' attribute not found in <' . $element->tagName .
'> tag'
225 return $node->textContent;
236 private function getChildText( DOMElement $element, $name, $default =
false ) {
237 $elements = $element->getElementsByTagName( $name );
239 if ( $elements->length < 1 ) {
240 if ( $default !==
false ) {
244 'Required <' . $name .
'> tag not found inside <' . $element->tagName .
'> tag'
249 $node = $elements->item( 0 );
250 return $node->textContent;
260 private function hasChild( DOMElement $element, $name ) {
261 return $this->
getChildText( $element, $name,
null ) !==
null;
268 if ( $this->exceptionCallback ) {
269 call_user_func( $this->exceptionCallback, $ex );
wfLogWarning( $msg, $callerOffset=1, $level=E_USER_WARNING)
Send a warning as a PHP error and the debug log.
importFromDOM(DOMElement $root)
makeSiteList(DOMElement $root)
hasChild(DOMElement $element, $name)
__construct(SiteStore $store)
callable null $exceptionCallback
getAttributeValue(DOMElement $element, $name, $default=false)
handleException(Exception $ex)
setExceptionCallback( $exceptionCallback)
makeSite(DOMElement $siteElement)
getChildText(DOMElement $element, $name, $default=false)
static newForType( $siteType)
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.