org.springframework.batch.admin.sample.LeadRandomizer.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.batch.admin.sample.LeadRandomizer.java

Source

/*
 * Copyright 2009-2010 the original author or authors.
 *
 * 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.springframework.batch.admin.sample;

import static org.junit.Assert.assertEquals;

import java.io.IOException;
import java.io.Writer;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.junit.Test;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.file.FlatFileHeaderCallback;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.FlatFileItemWriter;
import org.springframework.batch.item.file.LineCallbackHandler;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper;
import org.springframework.batch.item.file.transform.DefaultFieldSet;
import org.springframework.batch.item.file.transform.DelimitedLineAggregator;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;

public class LeadRandomizer {

    @Test
    public void testLeads() throws Exception {

        FlatFileItemReader<FieldSet> reader = new FlatFileItemReader<FieldSet>();
        reader.setResource(new ClassPathResource("/data/test.txt"));
        DefaultLineMapper<FieldSet> lineMapper = new DefaultLineMapper<FieldSet>();
        lineMapper.setLineTokenizer(new DelimitedLineTokenizer());
        lineMapper.setFieldSetMapper(new PassThroughFieldSetMapper());
        reader.setLinesToSkip(1);
        final List<String> headers = new ArrayList<String>();
        reader.setSkippedLinesCallback(new LineCallbackHandler() {
            public void handleLine(String line) {
                headers.add(line);
            }
        });
        reader.setLineMapper(lineMapper);
        reader.open(new ExecutionContext());

        List<FieldSet> list = new ArrayList<FieldSet>();
        FieldSet item = reader.read();
        while (item != null) {
            list.add(item);
            item = reader.read();
        }
        assertEquals(7, list.size());

        FlatFileItemWriter<FieldSet> writer = new FlatFileItemWriter<FieldSet>();
        FileSystemResource resource = new FileSystemResource("target/output/output.txt");
        FileUtils.deleteQuietly(resource.getFile());
        writer.setResource(resource);
        writer.setHeaderCallback(new FlatFileHeaderCallback() {
            public void writeHeader(Writer writer) throws IOException {
                for (String header : headers) {
                    writer.write(header);
                }
            }
        });
        writer.setLineAggregator(new DelimitedLineAggregator<FieldSet>());
        writer.open(new ExecutionContext());

        String[] names = getFields(list, 1);
        String[] country = getFields(list, 2);
        String[] products = getFields(list, 3);
        double[] amounts = getMinMax(list, 4);

        NumberFormat formatter = new DecimalFormat("#.##");
        int count = 20;
        for (int i = 0; i < 100; i++) {
            List<FieldSet> items = new ArrayList<FieldSet>();
            for (FieldSet fieldSet : list) {
                String[] values = fieldSet.getValues();
                values[0] = "" + (count++);
                values[1] = choose(names);
                values[2] = choose(country);
                values[3] = choose(products);
                values[4] = formatter.format(random(amounts));
                items.add(new DefaultFieldSet(values));
            }
            writer.write(items);
        }
        writer.close();

    }

    private String choose(String[] names) {
        return names[(int) (Math.random() * (names.length))];
    }

    private BigDecimal random(double[] amounts) {
        return new BigDecimal((int) ((Math.random() * (amounts[1] - amounts[0]) + amounts[0]) * 100))
                .divide(new BigDecimal(100));
    }

    private String[] getFields(List<FieldSet> list, int column) {
        List<String> values = new ArrayList<String>();
        for (FieldSet fieldSet : list) {
            values.add(fieldSet.readString(column));
        }
        return values.toArray(new String[values.size()]);
    }

    private double[] getMinMax(List<FieldSet> list, int column) {
        double min = 0;
        double max = 0;
        for (FieldSet fieldSet : list) {
            double x = fieldSet.readDouble(column);
            if (x > max)
                max = x;
            if (x < min)
                min = x;
        }
        return new double[] { min, max };
    }

}