/**
 * Copyright 2013 International Business Machines Corp.
 *
 * See the NOTICE file distributed with this work for additional information
 * regarding copyright ownership. Licensed 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.
 */
/*

 * Copyright 2012 International Business Machines Corp.
 * 
 * See the NOTICE file distributed with this work for additional information
 * regarding copyright ownership. Licensed 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.
 */
/**
 * Loads an instance of a batch artifact referenced in a JSL job definition XML
 * document.   By "batch artifact", we mean an object implementing some aspect of the
 * batch programming model defined in JSR352, e.g. a batchlet, a job or step listener, etc.
 *
 * <p> The artifacts will be reference in JSL, e.g.:
 *
 * <pre>
 *
 *  JSL document snippet:
 *  ---------------------
 *  {@literal <}batchlet ref="MyBatchlet"{@literal >}
 *
 *  Java code snippet:
 *  ------------------
 *  {@literal @}Batchlet("MyBatchlet")
 *  public class MyBatchletImpl
 *
 * </pre>
 *
 * <p>  No particular classloader scope is assumed by the interface, as the different
 * implementations will define behavior here.
 *
 */
package org.apache.batchee.spi;


import java.io.Closeable;

public interface BatchArtifactFactory extends BatchService {

    /**
     * @param batchId The value of a @ref attribute in a JSL element, e.g. 'batchlet'
     * @return An object instance of the artifact.
     */
    public Instance load(final String batchId);

    public static class Instance {
        private final Object value;
        private final Closeable releasable;

        public Instance(final Object value, final Closeable releasable) {
            this.value = value;
            this.releasable = releasable;
        }

        public Object getValue() {
            return value;
        }

        public Closeable getReleasable() {
            return releasable;
        }
    }
}
