All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fcrepo.jena.CopyOfBasic Maven / Gradle / Ivy

Go to download

The Fedora Commons Jena Patch module: Provides temporary patch for RDF 1.0 serialization.

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.fcrepo.jena;

import java.io.PrintWriter;

import org.apache.jena.rdf.model.* ;
import org.apache.jena.rdf.model.impl.Util ;
import org.apache.jena.vocabulary.RDFSyntax ;

/** Writes out an XML serialization of a model.
 */
public class CopyOfBasic extends CopyOfBaseXMLWriter
{
    public CopyOfBasic()
    {}

    private String space;

    @Override protected void writeBody
            ( Model model, PrintWriter pw, String base, boolean inclXMLBase )
    {
        setSpaceFromTabCount();
        writeRDFHeader( model, pw );
        writeRDFStatements( model, pw );
        writeRDFTrailer( pw, base );
        pw.flush();
    }

    private void setSpaceFromTabCount()
    {
        space = "";
        for (int i=0; i < tabSize; i += 1) space += " ";
    }

    protected void writeSpace( PrintWriter writer )
    { writer.print( space ); }

    private void writeRDFHeader(Model model, PrintWriter writer)
    {
        String xmlns = xmlnsDecl();
        writer.print( "<" + rdfEl( "RDF" ) + xmlns );
        if (null != xmlBase && xmlBase.length() > 0)
            writer.print( "\n  xml:base=" + substitutedAttribute( xmlBase ) );
        writer.println( " > " );
    }

    protected void writeRDFStatements( Model model, PrintWriter writer )
    {
        ResIterator rIter = model.listSubjects();
        while (rIter.hasNext()) writeRDFStatements( model, rIter.nextResource(), writer );
    }

    protected void writeRDFTrailer( PrintWriter writer, String base )
    { writer.println( "" ); }

    protected void writeRDFStatements
            ( Model model, Resource subject, PrintWriter writer )
    {
        StmtIterator sIter = model.listStatements( subject, null, (RDFNode) null );
        writeDescriptionHeader( subject, writer );
        while (sIter.hasNext()) writePredicate( sIter.nextStatement(), writer );
        writeDescriptionTrailer( subject, writer );
    }

    protected void writeDescriptionHeader( Resource subject, PrintWriter writer)
    {
        writer.print( space + "<" + rdfEl( "Description" ) + " " );
        writeResourceId( subject, writer );
        writer.println( ">" );
    }

    protected void writePredicate(Statement stmt, final PrintWriter writer)
    {
        final Property predicate = stmt.getPredicate();
        final RDFNode object = stmt.getObject();

        writer.print(space+space+
                "<"
                + startElementTag(
                predicate.getNameSpace(),
                predicate.getLocalName()));

        if (object instanceof Resource) {
            writer.print(" ");
            writeResourceReference(((Resource) object), writer);
            writer.println("/>");
        } else {
            writeLiteral((Literal) object, writer);
            writer.println(
                    "");
        }
    }

    @Override protected void unblockAll()
    { blockLiterals = false; }

    // NOTE, Fedora change: private -> protected
    protected boolean blockLiterals = false;

    @Override protected void blockRule( Resource r ) {
        if (r.equals( RDFSyntax.parseTypeLiteralPropertyElt )) {
            //       System.err.println("Blocking");
            blockLiterals = true;
        } else
            logger.warn("Cannot block rule <"+r.getURI()+">");
    }

    protected void writeDescriptionTrailer( Resource subject, PrintWriter writer )
    { writer.println( space + "" ); }


    protected void writeResourceId( Resource r, PrintWriter writer )
    {
        if (r.isAnon()) {
            writer.print(rdfAt("nodeID") + "=" + attributeQuoted(anonId(r)));
        } else {
            writer.print(
                    rdfAt("about")
                            + "="
                            + substitutedAttribute(relativize(r.getURI())));
        }
    }

    protected void writeResourceReference( Resource r, PrintWriter writer )
    {
        if (r.isAnon()) {
            writer.print(rdfAt("nodeID") + "=" + attributeQuoted(anonId(r)));
        } else {
            writer.print(
                    rdfAt("resource")
                            + "="
                            + substitutedAttribute(relativize(r.getURI())));
        }
    }

    protected void writeLiteral( Literal l, PrintWriter writer ) {
        String lang = l.getLanguage();
        String form = l.getLexicalForm();
        if (Util.isLangString(l)) {
            writer.print(" xml:lang=" + attributeQuoted( lang ));
        } else if (l.isWellFormedXML() && !blockLiterals) {
            // RDF XML Literals inline.
            writer.print(" " + rdfAt("parseType") + "=" + attributeQuoted( "Literal" )+">");
            writer.print( form );
            return ;
        } else {
            // Datatype (if not xsd:string and RDF 1.1)
            String dt = l.getDatatypeURI();
            if ( ! Util.isSimpleString(l) )
                writer.print( " " + rdfAt( "datatype" ) + "=" + substitutedAttribute( dt ) );
        }
        // Content.
        writer.print(">");
        writer.print( Util.substituteEntitiesInElementContent( form ) );
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy