EMMA Coverage Report (generated Tue May 06 07:29:23 PDT 2008)
[all classes][org.springframework.batch.core.step.item]

COVERAGE SUMMARY FOR SOURCE FILE [BatchListenerFactoryHelper.java]

nameclass, %method, %block, %line, %
BatchListenerFactoryHelper.java100% (4/4)100% (13/13)93%  (237/254)93%  (57.8/62)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class BatchListenerFactoryHelper100% (1/1)100% (6/6)90%  (160/177)90%  (35.8/40)
getSkipListeners (StepListener []): SkipListener [] 100% (1/1)58%  (18/31)47%  (2.8/6)
getStepListeners (StepListener []): StepExecutionListener [] 100% (1/1)87%  (27/31)83%  (5/6)
BatchListenerFactoryHelper (): void 100% (1/1)100% (3/3)100% (1/1)
addChunkListeners (RepeatOperations, StepListener []): RepeatOperations 100% (1/1)100% (48/48)100% (13/13)
getItemReader (ItemReader, StepListener []): ItemReader 100% (1/1)100% (32/32)100% (7/7)
getItemWriter (ItemWriter, StepListener []): ItemWriter 100% (1/1)100% (32/32)100% (7/7)
     
class BatchListenerFactoryHelper$1100% (1/1)100% (2/2)100% (29/29)100% (8/8)
BatchListenerFactoryHelper$1 (BatchListenerFactoryHelper, ItemReader, Composi... 100% (1/1)100% (10/10)100% (1/1)
read (): Object 100% (1/1)100% (19/19)100% (7/7)
     
class BatchListenerFactoryHelper$2100% (1/1)100% (2/2)100% (31/31)100% (9/9)
BatchListenerFactoryHelper$2 (BatchListenerFactoryHelper, ItemWriter, Composi... 100% (1/1)100% (10/10)100% (1/1)
write (Object): void 100% (1/1)100% (21/21)100% (8/8)
     
class BatchListenerFactoryHelper$3100% (1/1)100% (3/3)100% (17/17)100% (5/5)
BatchListenerFactoryHelper$3 (BatchListenerFactoryHelper, CompositeChunkListe... 100% (1/1)100% (9/9)100% (1/1)
close (RepeatContext): void 100% (1/1)100% (4/4)100% (2/2)
open (RepeatContext): void 100% (1/1)100% (4/4)100% (2/2)

1/*
2 * Copyright 2006-2007 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.springframework.batch.core.step.item;
17 
18import java.util.ArrayList;
19import java.util.List;
20 
21import org.springframework.batch.core.ChunkListener;
22import org.springframework.batch.core.ItemReadListener;
23import org.springframework.batch.core.ItemWriteListener;
24import org.springframework.batch.core.SkipListener;
25import org.springframework.batch.core.StepExecutionListener;
26import org.springframework.batch.core.StepListener;
27import org.springframework.batch.core.listener.CompositeChunkListener;
28import org.springframework.batch.core.listener.CompositeItemReadListener;
29import org.springframework.batch.core.listener.CompositeItemWriteListener;
30import org.springframework.batch.item.ItemReader;
31import org.springframework.batch.item.ItemWriter;
32import org.springframework.batch.item.support.DelegatingItemReader;
33import org.springframework.batch.item.support.DelegatingItemWriter;
34import org.springframework.batch.repeat.RepeatContext;
35import org.springframework.batch.repeat.RepeatOperations;
36import org.springframework.batch.repeat.listener.RepeatListenerSupport;
37import org.springframework.batch.repeat.support.RepeatTemplate;
38import org.springframework.util.Assert;
39 
40/**
41 * Package private helper for step factory beans.
42 * 
43 * @author Dave Syer
44 * 
45 */
46class BatchListenerFactoryHelper {
47 
48        /**
49         * @param itemReader
50         * @param listeners
51         */
52        public ItemReader getItemReader(ItemReader itemReader, StepListener[] listeners) {
53 
54                final CompositeItemReadListener multicaster = new CompositeItemReadListener();
55 
56                for (int i = 0; i < listeners.length; i++) {
57                        StepListener listener = listeners[i];
58                        if (listener instanceof ItemReadListener) {
59                                multicaster.register((ItemReadListener) listener);
60                        }
61                }
62 
63                itemReader = new DelegatingItemReader(itemReader) {
64                        public Object read() throws Exception {
65                                try {
66                                        multicaster.beforeRead();
67                                        Object item = super.read();
68                                        multicaster.afterRead(item);
69                                        return item;
70                                }
71                                catch (Exception e) {
72                                        multicaster.onReadError(e);
73                                        throw e;
74                                }
75                        }
76                };
77 
78                return itemReader;
79        }
80 
81        /**
82         * @param itemWriter
83         * @param listeners
84         */
85        public ItemWriter getItemWriter(ItemWriter itemWriter, StepListener[] listeners) {
86                final CompositeItemWriteListener multicaster = new CompositeItemWriteListener();
87 
88                for (int i = 0; i < listeners.length; i++) {
89                        StepListener listener = listeners[i];
90                        if (listener instanceof ItemWriteListener) {
91                                multicaster.register((ItemWriteListener) listener);
92                        }
93                }
94 
95                itemWriter = new DelegatingItemWriter(itemWriter) {
96                        public void write(Object item) throws Exception {
97                                try {
98                                        multicaster.beforeWrite(item);
99                                        super.write(item);
100                                        multicaster.afterWrite(item);
101                                }
102                                catch (Exception e) {
103                                        multicaster.onWriteError(e, item);
104                                        throw e;
105                                }
106                        }
107                };
108                
109                return itemWriter;
110 
111        }
112 
113        /**
114         * @param chunkOperations
115         * @param listeners
116         */
117        public RepeatOperations addChunkListeners(RepeatOperations chunkOperations, StepListener[] listeners) {
118 
119                final CompositeChunkListener multicaster = new CompositeChunkListener();
120 
121                boolean hasChunkListener = false;
122 
123                for (int i = 0; i < listeners.length; i++) {
124                        StepListener listener = listeners[i];
125                        if (listener instanceof ChunkListener) {
126                                hasChunkListener = true;
127                        }
128                        if (listener instanceof ChunkListener) {
129                                multicaster.register((ChunkListener) listener);
130                        }
131                }
132 
133                if (hasChunkListener) {
134 
135                        Assert.state(chunkOperations instanceof RepeatTemplate,
136                                        "Chunk operations is injected but not a RepeatTemplate, so chunk listeners cannot also be registered. "
137                                                        + "Either inject a RepeatTemplate, or remove the ChunkListener.");
138 
139                        RepeatTemplate stepTemplate = (RepeatTemplate) chunkOperations;
140                        stepTemplate.registerListener(new RepeatListenerSupport() {
141                                public void open(RepeatContext context) {
142                                        multicaster.beforeChunk();
143                                }
144                                public void close(RepeatContext context) {
145                                        multicaster.afterChunk();
146                                }
147                        });
148 
149                }
150 
151                return chunkOperations;
152 
153        }
154 
155        /**
156         * @param listeners
157         */
158        public StepExecutionListener[] getStepListeners(StepListener[] listeners) {
159                List list = new ArrayList();
160                for (int i = 0; i < listeners.length; i++) {
161                        StepListener listener = listeners[i];
162                        if (listener instanceof StepExecutionListener) {
163                                list.add(listener);
164                        }
165                }
166                return (StepExecutionListener[]) list.toArray(new StepExecutionListener[list.size()]);
167        }
168 
169        /**
170         * @param listeners
171         */
172        public SkipListener[] getSkipListeners(StepListener[] listeners) {
173                List list = new ArrayList();
174                for (int i = 0; i < listeners.length; i++) {
175                        StepListener listener = listeners[i];
176                        if (listener instanceof SkipListener) {
177                                list.add(listener);
178                        }
179                }
180                return (SkipListener[]) list.toArray(new SkipListener[list.size()]);
181        }
182 
183}

[all classes][org.springframework.batch.core.step.item]
EMMA 2.0.5312 (C) Vladimir Roubtsov