/**
* Copyright 2010 Molindo GmbH
*
* 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 at.molindo.esi4j.chain.impl;
import at.molindo.esi4j.chain.Esi4JBatchedEntityResolver;
import at.molindo.esi4j.chain.Esi4JEntityTask;
import at.molindo.esi4j.chain.Esi4JSessionEntityResolver;
import at.molindo.esi4j.chain.Esi4JTaskProcessor;
import at.molindo.esi4j.core.Esi4JIndex;
import at.molindo.utils.collections.ArrayUtils;
/**
* {@link Esi4JTaskProcessor} that uses a {@link QueuedTaskExecutor} to process tasks asynchronously
*/
public class QueuedTaskProcessor extends AbstractTaskProcessor implements Esi4JTaskProcessor {
private final QueuedTaskExecutor _executor;
public QueuedTaskProcessor(final Esi4JIndex index, final Esi4JBatchedEntityResolver entityResolver) {
super(index);
_executor = new QueuedTaskExecutor(this, entityResolver);
}
public Esi4JBatchedEntityResolver getEntityResolver() {
return _executor.getEntityResolver();
}
@Override
public void processTasks(final Esi4JEntityTask[] tasks) {
if (ArrayUtils.empty(tasks)) {
return;
}
_executor.execute(tasks);
}
@Override
public <T> T execute(final SerializableEsi4JOperation<T> operation) {
return _executor.submit(operation);
}
/**
* make sure to always call {@link #onAfterBulkIndex()} afterwards
*/
protected void onBeforeBulkIndex() {
final Esi4JBatchedEntityResolver resolver = getEntityResolver();
if (resolver instanceof Esi4JSessionEntityResolver) {
((Esi4JSessionEntityResolver) resolver).startResolveSession();
}
}
protected void onAfterBulkIndex() {
final Esi4JBatchedEntityResolver resolver = getEntityResolver();
if (resolver instanceof Esi4JSessionEntityResolver) {
((Esi4JSessionEntityResolver) resolver).closeResolveSession();
}
}
@Override
public void close() {
_executor.close();
super.close();
}
}