001/*
002 * Copyright 2006-2013 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      https://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.springframework.batch.core.listener;
017
018import java.util.Iterator;
019import java.util.List;
020
021import org.springframework.batch.core.SkipListener;
022import org.springframework.core.Ordered;
023
024/**
025 * @author Dave Syer
026 *
027 */
028public class CompositeSkipListener<T,S> implements SkipListener<T,S> {
029
030        private OrderedComposite<SkipListener<? super T,? super S>> listeners = new OrderedComposite<SkipListener<? super T,? super S>>();
031
032        /**
033         * Public setter for the listeners.
034         *
035         * @param listeners list of {@link SkipListener}s to be called when skip events occur.
036         */
037        public void setListeners(List<? extends SkipListener<? super T,? super S>> listeners) {
038                this.listeners.setItems(listeners);
039        }
040
041        /**
042         * Register additional listener.
043         *
044         * @param listener instance of {@link SkipListener} to be registered.
045         */
046        public void register(SkipListener<? super T,? super S> listener) {
047                listeners.add(listener);
048        }
049
050        /**
051         * Call the registered listeners in order, respecting and prioritising those
052         * that implement {@link Ordered}.
053         * @see org.springframework.batch.core.SkipListener#onSkipInRead(java.lang.Throwable)
054         */
055        @Override
056        public void onSkipInRead(Throwable t) {
057                for (Iterator<SkipListener<? super T,? super S>> iterator = listeners.iterator(); iterator.hasNext();) {
058                        SkipListener<? super T,? super S> listener = iterator.next();
059                        listener.onSkipInRead(t);
060                }
061        }
062
063        /**
064         * Call the registered listeners in order, respecting and prioritising those
065         * that implement {@link Ordered}.
066         * @see org.springframework.batch.core.SkipListener#onSkipInWrite(java.lang.Object,
067         * java.lang.Throwable)
068         */
069        @Override
070        public void onSkipInWrite(S item, Throwable t) {
071                for (Iterator<SkipListener<? super T,? super S>> iterator = listeners.iterator(); iterator.hasNext();) {
072                        SkipListener<? super T,? super S> listener = iterator.next();
073                        listener.onSkipInWrite(item, t);
074                }
075        }
076
077        /**
078         * Call the registered listeners in order, respecting and prioritising those
079         * that implement {@link Ordered}.
080         * @see org.springframework.batch.core.SkipListener#onSkipInWrite(java.lang.Object,
081         * java.lang.Throwable)
082         */
083        @Override
084        public void onSkipInProcess(T item, Throwable t) {
085                for (Iterator<SkipListener<? super T,? super S>> iterator = listeners.iterator(); iterator.hasNext();) {
086                        SkipListener<? super T,? super S> listener = iterator.next();
087                        listener.onSkipInProcess(item, t);
088                }
089        }
090
091}