/*
 * 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.assembler;

import org.apache.jena.assembler.assemblers.* ;
import org.apache.jena.rdf.model.* ;

/**
    An Assembler creates objects from their RDF descriptions. The root motivation
    is to create Models, but other objects are required as sub-components of
    those Models, so a general mechanism is available.
*/
public interface Assembler
    {
    
    /**
        The core operation: answer a new object constructed according to the
        object description hanging from <code>root</code>, using the assembler
        <code>a</code> for any sub-objects. Use <code>mode</code> to decide
        if persistent objects are to be re-used or created; this mode is passed down
        to all sub-object construction.
    */
    public Object open( Assembler a, Resource root, Mode mode );
    
    /**
        Answer <code>open( a, root, Mode.DEFAULT )</code>.
    */
    public Object open( Assembler a, Resource root );
    
    /**
        Answer <code>open( this, root, Mode.DEFAULT )</code>.
    */
    public Object open( Resource root );

    /**
        Answer <code>(Model) open( this, root, Mode.DEFAULT )</code>, unless
        the result cannot be or is not a Model, in which case throw an exception.
    */
    public Model openModel( Resource root );

    /**
        Answer <code>(Model) open( this, root, mode )</code>, unless
        the result cannot be or is not a Model, in which case throw an exception.
    */
    public Model openModel( Resource root, Mode mode );
    
    // This slightly bizarre way to initial "constants" is because Assembler is
    // an interface. Interfaces inside class intialization processes do not have
    // their computer static fields initialized yet. To keep that, for
    // compatibility, initialization code must use the ConstAssembler functions
    // and not use constants here.  Assembler.general is the key field used
    // in ARQ.init (AssemblerUtils) and TDB.init (VocabTDB).
    
    public static final Assembler defaultModel = ConstAssembler.defaultModel() ;
    
    public static final Assembler memoryModel = ConstAssembler.memoryModel() ;

    public static final Assembler infModel = ConstAssembler.infModel();

    public static final Assembler ontModel = ConstAssembler.ontModel();

    public static final Assembler reasonerFactory = ConstAssembler.reasonerFactory();

    public static final Assembler content = ConstAssembler.content();
    
    public static final Assembler prefixMapping = ConstAssembler.prefixMapping();

    public static final Assembler unionModel = ConstAssembler.unionModel();

    public static final Assembler ontModelSpec = ConstAssembler.ontModelSpec();
    
    public static final Assembler ruleSet = ConstAssembler.ruleSet();
    
    public static final Assembler modelSource = ConstAssembler.modelSource();
    
    public static final Assembler locationMapper = ConstAssembler.locationMapper();

    public static final Assembler fileManager = ConstAssembler.fileManager();

    public static final Assembler documentManager = ConstAssembler.documentManager();
    
    public static final AssemblerGroup general = ConstAssembler.general() ;
    }

@@ -1140,16 +1140,285 @@
 ilable.%0A
+    %0A    @apiNote Methods accepting %7B@link Model%7D as a parameter treat appropriate values of %7B@code Model%7D as passing down%0A    to sub-assemblers a requirement to share for certain setups that work as tightly coordinated groups. It's a hint,%0A    not an instruction.%0A   %0A
 */%0Apubli

Add Javadoc for Assembler indicating that Model is advisory