fr.acxio.tools.agia.transform.ListFieldSetToMapProcessor.java Source code

Java tutorial

Introduction

Here is the source code for fr.acxio.tools.agia.transform.ListFieldSetToMapProcessor.java

Source

package fr.acxio.tools.agia.transform;

/*
 * Copyright 2014 Acxio
 * 
 * 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.
 */

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.file.transform.FieldSet;

/**
 * <p>Transforms a list of {@code FieldSet} into a {@code Map}.</p>
 * <p>The names of the FieldSet will be used as the key in the map. If a name
 * is null or empty, the key is built from index of the FieldSet into the list
 * and from the index of the column into the FieldSet, with the format:
 * {@code rec%d_ucol%d}.</p>
 * <p>For example, if the list contains 2 FieldSet, the first one having the
 * names "Field1" and null, the second one having the names null, "Field2" and
 * "Field3", the resulting map will contain the keys: {@code rec0_Field1,
 * rec0_ucol1, rec1_ucol0, rec1_Field2, rec1_Field3}.</p>
 * <p>The prefixes used for the FieldSet index and the column index can be
 * set to other values.</p>
 * 
 * @author pcollardez
 *
 */
public class ListFieldSetToMapProcessor implements ItemProcessor<List<FieldSet>, Map<String, Object>> {

    protected String unnamedColumnFormat = "ucol%d";
    protected String fieldsetNameFormat = "rec%d_%s";

    public void setUnnamedColumnPrefix(String sUnnamedColumnPrefix) {
        unnamedColumnFormat = sUnnamedColumnPrefix + "%d";
    }

    public void setFieldsetNamePrefix(String sFieldsetNamePrefix) {
        fieldsetNameFormat = sFieldsetNamePrefix + "%d_%s";
    }

    @Override
    public Map<String, Object> process(List<FieldSet> sItem) throws Exception {
        Map<String, Object> aResult = null;
        if ((sItem != null) && !sItem.isEmpty()) {
            aResult = new HashMap<String, Object>();
            for (int aRecIdx = 0; aRecIdx < sItem.size(); aRecIdx++) {
                aResult.putAll(mapFieldSet(sItem.get(aRecIdx), aRecIdx));
            }
        }
        return aResult;
    }

    protected Map<String, Object> mapFieldSet(FieldSet sFieldSet, int sRecIdx) {
        Map<String, Object> aResult = new HashMap<String, Object>();
        if (sFieldSet != null) {
            boolean aHasNames = sFieldSet.hasNames();
            int aFieldCount = sFieldSet.getFieldCount();
            String[] aNames = aHasNames ? sFieldSet.getNames() : null;
            String[] aValues = sFieldSet.getValues();
            for (int i = 0; i < aFieldCount; i++) {
                aResult.put(String.format(fieldsetNameFormat, sRecIdx,
                        (aHasNames && (aNames[i] != null) && !aNames[i].isEmpty()) ? aNames[i]
                                : String.format(unnamedColumnFormat, i)),
                        aValues[i]);
            }
        }
        return aResult;
    }

}