/**
* 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.apache.jena.riot.writer;
import static org.apache.jena.riot.writer.WriterConst.GDFT_BRACE ;
import static org.apache.jena.riot.writer.WriterConst.INDENT_GDFT ;
import static org.apache.jena.riot.writer.WriterConst.INDENT_GNMD ;
import static org.apache.jena.riot.writer.WriterConst.NL_GDFT_END ;
import static org.apache.jena.riot.writer.WriterConst.NL_GDFT_START ;
import static org.apache.jena.riot.writer.WriterConst.NL_GNMD_END ;
import static org.apache.jena.riot.writer.WriterConst.NL_GNMD_START ;
import java.util.Iterator ;
import org.apache.jena.atlas.io.IndentedWriter ;
import org.apache.jena.graph.Node ;
import org.apache.jena.riot.system.PrefixMap ;
import org.apache.jena.sparql.core.DatasetGraph ;
import org.apache.jena.sparql.core.Quad ;
import org.apache.jena.sparql.util.Context ;
/** TriG pretty writer */
public class TriGWriter extends TriGWriterBase
{
@Override
protected void output(IndentedWriter iOut, DatasetGraph dsg, PrefixMap prefixMap, String baseURI, Context context) {
TriGWriter$ w = new TriGWriter$(iOut, prefixMap, baseURI, context) ;
w.write(dsg) ;
}
private static class TriGWriter$ extends TurtleShell
{
TriGWriter$(IndentedWriter out, PrefixMap prefixMap, String baseURI, Context context) {
super(out, prefixMap, baseURI, context) ;
}
private void write(DatasetGraph dsg) {
writeBase(baseURI) ;
writePrefixes(prefixMap) ;
if ( !prefixMap.isEmpty() && !dsg.isEmpty() )
out.println() ;
Iterator<Node> graphNames = dsg.listGraphNodes() ;
boolean anyGraphOutput = writeGraphTriG(dsg, null) ;
for ( ; graphNames.hasNext() ; ) {
if ( anyGraphOutput )
out.println() ;
Node gn = graphNames.next() ;
anyGraphOutput |= writeGraphTriG(dsg, gn) ;
}
}
/** Return true if anything written */
private boolean writeGraphTriG(DatasetGraph dsg, Node name) {
boolean dftGraph = ( name == null || name == Quad.defaultGraphNodeGenerated ) ;
if ( dftGraph && dsg.getDefaultGraph().isEmpty() )
return false ;
if ( dftGraph && ! GDFT_BRACE ) {
// Non-empty default graph, no braces.
// No indenting.
writeGraphTTL(dsg, name) ;
return true ;
}
// The graph will go in braces, whether non-empty default graph or a named graph.
boolean NL_START = ( dftGraph ? NL_GDFT_START : NL_GNMD_START ) ;
boolean NL_END = ( dftGraph ? NL_GDFT_END : NL_GNMD_END ) ;
int INDENT_GRAPH = ( dftGraph ? INDENT_GDFT : INDENT_GNMD ) ;
if ( !dftGraph ) {
writeNode(name) ;
out.print(" ") ;
}
out.print("{") ;
if ( NL_START )
out.println() ;
else
out.print(" ") ;
out.incIndent(INDENT_GRAPH) ;
writeGraphTTL(dsg, name) ;
out.decIndent(INDENT_GRAPH) ;
if ( NL_END )
out.ensureStartOfLine() ;
out.println("}") ;
return true ;
}
}
}