예제 #1
0
    /**
     * Write (or delte, if $delete is set to true) the data in the object
     * variables, to the wiki page corresponding to this page handler
     * @param boolean $delete
     */
    public function writeOrDeleteDataToWiki( $delete = false ) {
        if ( $delete ) {
            if ( $this->checkWikiPageExists() ) {
                $this->initSMWWriter( $delete = true );
            } else {
                return;
            }
        } else {
            $this->ensureWikiPageExists();
            $this->initSMWWriter();
        }

        $properties = $this->m_properties;
        foreach ( $properties as $cur_prop ) {
            $propertystring = $cur_prop['p'];
            // TODO: Remove old code:
            // $property = SMWPropertyValue::makeUserProperty( $propertystring );
            $property_di = SMWDIProperty::newFromUserLabel($propertystring);
            $valuestring = RDFIOUtils::sanitizeSMWValue( $cur_prop['v'] );
            $value    = SMWDataValueFactory::newPropertyObjectValue( $property_di, $valuestring );

            $propertyErrorText = $property->getErrorText();
            $propertyHasError = ( $propertyErrorText != '' );
            if ( $propertyHasError ) {
                $this->addError( "<p>In RDFIOPageHandler::writeOrDeleteDataToWiki(): " . $property->getErrorText() . "</p>" );
            }

            $valueErrorText = $value->getErrorText();
            $valueHasError = ( $valueErrorText != '' );
            if ( $valueHasError ) {
                $this->addError( "<p>Error creating property value object in RDFIOPageHandler::writeOrDeleteDataToWiki():</p><p>" . $value->getErrorText() . "</p>" );
            }
            if ( $delete ) {
                $this->m_smwwriter_remove->addPropertyObjectValue( $property, $value );
                $editmessage = "Deleting properties. Last property delete: " . $propertystring . " : " . $valuestring;
            } else {
                $this->m_smwwriter_add->addPropertyObjectValue( $property, $value );
                $editmessage = "Importing properties. Last property added: " . $propertystring . " : " . $valuestring;
            }
        }

        $this->m_smwwriter->update( $this->m_smwwriter_remove, $this->m_smwwriter_add, $editmessage );
        $smwWriterError = $this->m_smwwriter->getError();
        $smwWriterHasError = ( $smwWriterError != '' );
        if ( $smwWriterHasError ) {
            $this->addError( "<p>SMWWriter Error: " . $smwWriterError . "</p>" );
        }
    }
    /**
     * Prepare page handlers, which represent wiki pages to be written to/deleted from,
     * and the corresponding facts to add/remove
     */
    private function preparePageHandlers() {
        // The page below should not be deleted on delete operations
        if ( !$this->m_delete ) {
            // Add type info to the Original URI property
            $property_hastypeurl = array( array( 'p' => 'Has type', 'v' => 'URL' ) );
            $origuripage = new RDFIOPageHandler( 'Original URI', SMW_NS_PROPERTY, $property_hastypeurl );
            $this->addToPages( $origuripage );
        }

        // Prepare for storing the data to write in internal data structure ($this->m_pages)
        $unique_subject_uris = $this->getUniqueSubjectURIs();
        foreach ( $unique_subject_uris as $subject_uri ) {
            $properties = array();
            // A URIResolver URI indicates that internal titles only are used and we have no Original URI available
            if (  !$this->m_delete && !RDFIOUtils::isURIResolverURI( $subject_uri ) && !RDFIOUtils::isArcUntitledNode( $subject_uri ) ) {
                // Add the Original URI fact to the list of properties
                $properties[0] = $this->createOrigURIPropertyArray( $subject_uri );
                $properties[1] = $this->createEquivURIPropertyArray( $subject_uri );
                $i++;
            }

            $wikititle = $this->getWikiTitleForURI( $subject_uri );
            $triplesforpage = $this->getTriplesForSubject( $subject_uri );

            $i = 2;
            foreach ( $triplesforpage as $triple ) {
                $propertyuri = $triple['p'];
                $valueorig = $triple['o'];
                $valuetype = $triple['o_type'];
                $property = $this->getWikiTitleForURI( $propertyuri, $isproperty = true );
                if ( $valuetype == 'uri' ) {
                    $value = $this->getWikiTitleForURI( $valueorig );
                } else {
                    $value = RDFIOUtils::sanitizeSMWValue( $valueorig );
                }
                $properties[$i] = array( 'p' => $property, 'v' => $value );
                $i++;
            }

            $this->addToPages( new RDFIOPageHandler( $wikititle, NS_MAIN, $properties ) );
        }

        // The data generated below should not be deleted when doing delete operations, and thus,
        // pagehandlers for them should not be prepared on delete.
        if ( !$this->m_delete ) {
            // Prepare property pages
            $unique_property_uris = $this->getUniquePropertyURIs();
            foreach ( $unique_property_uris as $property_uri => $property_uridata ) {
                $wikititle = $this->getWikiTitleForURI( $property_uri, $isproperty = true );

                $type = $this->convertARCTypeToSMWType( $property_uridata['type'], $property_uridata['datatype'] );
                $property_hastype = array( 'p' => 'Has type', 'v' => $type );
                // A URIResolver URI indicates that internal titles only are used and we have no Original URI available
                if ( !RDFIOUtils::isURIResolverURI( $property_uri ) && !RDFIOUtils::isArcUntitledNode( $wikititle ) ) {
                    $property_origuri = $this->createOrigURIPropertyArray( $property_uri );
                    $property_equivuri = $this->createEquivURIPropertyArray( $property_uri );
                    $properties = array( $property_origuri, $property_equivuri, $property_hastype );
                } else {
                    $properties = array( $property_hastype );
                }
                $propertypage = new RDFIOPageHandler( $wikititle, SMW_NS_PROPERTY, $properties );
                $this->addToPages( $propertypage );
            }

            // Prepare value pages
            // TODO: Look for a way to merge with the above code, or otherwise refactor ...
            $unique_value_uris = $this->getUniqueValueURIs();
            foreach ( $unique_value_uris as $unique_value_uri ) {
                $wikititle = $this->getWikiTitleForURI( $unique_value_uri );

                // A URIResolver URI indicates that internal titles only are used and we have no Original URI available
                if ( !RDFIOUtils::isURIResolverURI( $unique_value_uri ) && !RDFIOUtils::isArcUntitledNode( $unique_value_uri ) ) {
                    $value_origuri = $this->createOrigURIPropertyArray( $unique_value_uri );
                    $value_equivuri = $this->createEquivURIPropertyArray( $unique_value_uri );
                    $values = array( $value_origuri, $value_equivuri );
                }
                $valuepage = new RDFIOPageHandler( $wikititle, NS_MAIN, $values );
                $this->addToPages( $valuepage );
            }
        }
    }