diff --git a/cli/src/main/java/de/atextor/owlcli/OWLCLIWriteCommand.java b/cli/src/main/java/de/atextor/owlcli/OWLCLIWriteCommand.java index d6334d12..30d54f9b 100644 --- a/cli/src/main/java/de/atextor/owlcli/OWLCLIWriteCommand.java +++ b/cli/src/main/java/de/atextor/owlcli/OWLCLIWriteCommand.java @@ -19,6 +19,7 @@ import de.atextor.owlcli.write.RdfWriter; import de.atextor.turtle.formatter.FormattingStyle; import org.apache.jena.rdf.model.Property; +import org.apache.jena.rdf.model.RDFNode; import org.apache.jena.rdf.model.Resource; import org.apache.jena.rdf.model.ResourceFactory; import org.apache.jena.sys.JenaSystem; @@ -35,6 +36,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.function.BiFunction; import java.util.stream.Collectors; @CommandLine.Command( name = "write", @@ -46,15 +48,15 @@ "https://atextor.de/owl-cli/main/" + OWLCLIConfig.VERSION + "/usage.html#write-command" ) public class OWLCLIWriteCommand extends AbstractCommand implements Runnable { + private static final Logger LOG = LoggerFactory.getLogger( OWLCLIWriteCommand.class ); + + private static final Configuration config = RdfWriter.DEFAULT_CONFIGURATION; + static { JenaSystem.setSubsystemRegistry( new StaticJenaSubsystemRegistry() ); JenaSystem.init(); } - private static final Logger LOG = LoggerFactory.getLogger( OWLCLIWriteCommand.class ); - - private static final Configuration config = RdfWriter.DEFAULT_CONFIGURATION; - @CommandLine.Mixin LoggingMixin loggingMixin; @@ -153,6 +155,15 @@ public class OWLCLIWriteCommand extends AbstractCommand implements Runnable { description = "Sort order for predicates (Default: ${DEFAULT-VALUE})" ) private List predicateOrder = FormattingStyle.DEFAULT.predicateOrder; + @CommandLine.Option( names = { "--objectOrder" }, + description = "Sort order for objects (Default: ${DEFAULT-VALUE})" ) + private List objectOrder = FormattingStyle.DEFAULT.objectOrder; + + @CommandLine.Option( names = { "--anonymousNodeIdPattern" }, + description = "Name pattern for blank node IDs (Default: ${DEFAULT-VALUE})" ) + private String anonymousNodeIdPattern = + FormattingStyle.DEFAULT.anonymousNodeIdGenerator.apply( ResourceFactory.createResource(), 0 ); + @CommandLine.Parameters( paramLabel = "INPUT", description = "File name, URL, or - for stdin", arity = "1", index = "0" ) private String input; @@ -185,6 +196,8 @@ public void run() { .prefixOrder( prefixOrder ) .subjectOrder( subjectOrder ) .predicateOrder( predicateOrder ) + .objectOrder( objectOrder ) + .anonymousNodeIdGenerator( buildAnonymousNodeIdGenerator( anonymousNodeIdPattern ) ) .build(); final Configuration.ConfigurationBuilder configurationBuilder = Configuration.builder() @@ -220,6 +233,11 @@ public void registerTypeConverters( final CommandLine commandLine ) { commandLine.registerConverter( NumberFormat.class, new NumberFormatConverter() ); commandLine.registerConverter( Property.class, new PropertyConverter() ); commandLine.registerConverter( Resource.class, new ResourceConverter() ); + commandLine.registerConverter( RDFNode.class, new RDFNodeConverter() ); + } + + private BiFunction buildAnonymousNodeIdGenerator( final String pattern ) { + return ( resource, integer ) -> pattern.replace( "0", "" + integer ); } private static class NumberFormatConverter implements CommandLine.ITypeConverter { @@ -267,4 +285,13 @@ public Resource convert( final String value ) throws Exception { return ResourceFactory.createResource( propertyUri ); } } + + private class RDFNodeConverter extends AbstractResourceConverter implements CommandLine.ITypeConverter { + @Override + public RDFNode convert( final String value ) throws Exception { + final String propertyUri = buildResourceUri( value ); + return ResourceFactory.createResource( propertyUri ); + } + } + }