/* * 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. */ package org.apache.batchee.container.proxy; import org.apache.batchee.container.impl.StepContextImpl; import org.apache.batchee.container.impl.jobinstance.RuntimeJobExecution; import org.apache.batchee.container.services.ServicesManager; import org.apache.batchee.spi.BatchArtifactFactory; import javax.batch.api.Batchlet; import javax.batch.api.Decider; import javax.batch.api.chunk.CheckpointAlgorithm; import javax.batch.api.chunk.ItemProcessor; import javax.batch.api.chunk.ItemReader; import javax.batch.api.chunk.ItemWriter; import javax.batch.api.partition.PartitionAnalyzer; import javax.batch.api.partition.PartitionCollector; import javax.batch.api.partition.PartitionMapper; import javax.batch.api.partition.PartitionReducer; /* * Introduce a level of indirection so proxies are not instantiated directly by newing them up. */ public class ProxyFactory { private static final BatchArtifactFactory ARTIFACT_FACTORY = ServicesManager.service(BatchArtifactFactory.class); private static final ThreadLocal<InjectionReferences> INJECTION_CONTEXT = new ThreadLocal<InjectionReferences>(); protected static Object loadArtifact(final String id, final InjectionReferences injectionReferences, final RuntimeJobExecution execution) { INJECTION_CONTEXT.set(injectionReferences); try { final BatchArtifactFactory.Instance instance = ARTIFACT_FACTORY.load(id); if (instance == null) { return null; } if (instance.getReleasable() != null && execution != null) { execution.addReleasable(instance.getReleasable()); } return instance.getValue(); } catch (final Exception e) { throw new RuntimeException(e); } finally { INJECTION_CONTEXT.remove(); } } public static InjectionReferences getInjectionReferences() { return INJECTION_CONTEXT.get(); } /* * Decider */ public static DeciderProxy createDeciderProxy(final String id, final InjectionReferences injectionRefs, final RuntimeJobExecution execution) { return new DeciderProxy(Decider.class.cast(loadArtifact(id, injectionRefs, execution))); } /* * Batchlet artifact */ public static BatchletProxy createBatchletProxy(final String id, final InjectionReferences injectionRefs, final StepContextImpl stepContext, final RuntimeJobExecution execution) { final Batchlet loadedArtifact = (Batchlet) loadArtifact(id, injectionRefs, execution); final BatchletProxy proxy = new BatchletProxy(loadedArtifact); proxy.setStepContext(stepContext); return proxy; } /* * The four main chunk-related artifacts */ public static CheckpointAlgorithmProxy createCheckpointAlgorithmProxy(final String id, final InjectionReferences injectionRefs, final StepContextImpl stepContext, final RuntimeJobExecution execution) { final CheckpointAlgorithm loadedArtifact = (CheckpointAlgorithm) loadArtifact(id, injectionRefs, execution); final CheckpointAlgorithmProxy proxy = new CheckpointAlgorithmProxy(loadedArtifact); proxy.setStepContext(stepContext); return proxy; } public static ItemReaderProxy createItemReaderProxy(final String id, final InjectionReferences injectionRefs, final StepContextImpl stepContext, final RuntimeJobExecution execution) { final ItemReader loadedArtifact = (ItemReader) loadArtifact(id, injectionRefs, execution); final ItemReaderProxy proxy = new ItemReaderProxy(loadedArtifact); proxy.setStepContext(stepContext); return proxy; } public static ItemProcessorProxy createItemProcessorProxy(final String id, final InjectionReferences injectionRefs, final StepContextImpl stepContext, final RuntimeJobExecution execution) { final ItemProcessor loadedArtifact = (ItemProcessor) loadArtifact(id, injectionRefs, execution); final ItemProcessorProxy proxy = new ItemProcessorProxy(loadedArtifact); proxy.setStepContext(stepContext); return proxy; } public static ItemWriterProxy createItemWriterProxy(final String id, final InjectionReferences injectionRefs, final StepContextImpl stepContext, final RuntimeJobExecution execution) { final ItemWriter loadedArtifact = (ItemWriter) loadArtifact(id, injectionRefs, execution); final ItemWriterProxy proxy = new ItemWriterProxy(loadedArtifact); proxy.setStepContext(stepContext); return proxy; } /* * The four partition-related artifacts */ public static PartitionReducerProxy createPartitionReducerProxy(final String id, final InjectionReferences injectionRefs, final StepContextImpl stepContext, final RuntimeJobExecution execution) { final PartitionReducer loadedArtifact = (PartitionReducer) loadArtifact(id, injectionRefs, execution); final PartitionReducerProxy proxy = new PartitionReducerProxy(loadedArtifact); proxy.setStepContext(stepContext); return proxy; } public static PartitionMapperProxy createPartitionMapperProxy(final String id, final InjectionReferences injectionRefs, final StepContextImpl stepContext, final RuntimeJobExecution execution) { final PartitionMapper loadedArtifact = (PartitionMapper) loadArtifact(id, injectionRefs, execution); final PartitionMapperProxy proxy = new PartitionMapperProxy(loadedArtifact); proxy.setStepContext(stepContext); return proxy; } public static PartitionAnalyzerProxy createPartitionAnalyzerProxy(final String id, final InjectionReferences injectionRefs, final StepContextImpl stepContext, final RuntimeJobExecution execution) { final PartitionAnalyzer loadedArtifact = (PartitionAnalyzer) loadArtifact(id, injectionRefs, execution); final PartitionAnalyzerProxy proxy = new PartitionAnalyzerProxy(loadedArtifact); proxy.setStepContext(stepContext); return proxy; } public static PartitionCollectorProxy createPartitionCollectorProxy(final String id, final InjectionReferences injectionRefs, final StepContextImpl stepContext, final RuntimeJobExecution execution) { final PartitionCollector loadedArtifact = (PartitionCollector) loadArtifact(id, injectionRefs, execution); final PartitionCollectorProxy proxy = new PartitionCollectorProxy(loadedArtifact); proxy.setStepContext(stepContext); return proxy; } }