com.processpuzzle.address.artifact.SettlementDataLoader.java Source code

Java tutorial

Introduction

Here is the source code for com.processpuzzle.address.artifact.SettlementDataLoader.java

Source

/*
Name: 
- SettlementDataLoader
    
Description: 
-  
    
Requires:
- 
    
Provides:
- 
    
Part of: ProcessPuzzle Framework, Domain and Business Model Ready Architecture. Provides content, workflow and social networking functionality. 
http://www.processpuzzle.com
    
ProcessPuzzle - Content and Workflow Management Integration Business Platform
    
Author(s): 
- Zsolt Zsuffa
    
Copyright: (C) 2011 This program is free software: you can redistribute it and/or modify it under the terms of the 
GNU General Public License as published by the Free Software Foundation, either version 3 of the License, 
or (at your option) any later version.
    
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

package com.processpuzzle.address.artifact;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;

import com.processpuzzle.address.domain.Country;
import com.processpuzzle.address.domain.CountryFactory;
import com.processpuzzle.address.domain.CountryRepository;
import com.processpuzzle.address.domain.District;
import com.processpuzzle.address.domain.Settlement;
import com.processpuzzle.address.domain.SettlementFactory;
import com.processpuzzle.address.domain.ZipCode;
import com.processpuzzle.address.domain.ZipCodeFactory;
import com.processpuzzle.application.resource.domain.XmlDataLoader;
import com.processpuzzle.persistence.domain.DefaultUnitOfWork;

public class SettlementDataLoader extends XmlDataLoader {
    private static final String DEFAULT_COUNTRY_NAME = "Magyarorszg";
    private static final String ROOT_ELEMENT = "country";
    private static final String COUNTRY_NAME_ATTRIBUTE = "name";
    private static final String SETTLEMENT_ELEMENT = "settlement";
    private static final String SETTLEMENT_NAME_ATTRIBUTE = "name";
    private static final String DISTRICT_ELEMENT = "district";
    private static final String DISTRICT_NAME_ATTRIBUTE = "name";
    private static final String ZIPCODE_ELEMENT = "zipcode";
    private static final String CODE_ATTRIBUTE = "code";
    private SettlementDataSheetRepository artifactRepository;
    private static CountryFactory countryFactory;
    private static SettlementFactory settlementFactory;
    private static SettlementDataSheetFactory settlementDataSheetFactory;
    private static ZipCodeFactory zipCodeFactory;
    private static SettlementDataSheetRepository settlementDataSheetRepository;
    private static CountryRepository countryRepository;
    private List<Settlement> savedSettlements = new ArrayList<Settlement>();

    public SettlementDataLoader(String sourcePath, String schemePath) {
        super(sourcePath, schemePath);

        resultInPersistentObjects = true;

    }

    public List<Settlement> getSavedSettlements() {
        return savedSettlements;
    }

    @SuppressWarnings("unchecked")
    @Override
    public void loadData() {
        super.loadData();

        countryFactory = applicationContext.getEntityFactory(CountryFactory.class);
        countryRepository = applicationContext.getRepository(CountryRepository.class);
        settlementFactory = applicationContext.getEntityFactory(SettlementFactory.class);
        settlementDataSheetFactory = applicationContext.getEntityFactory(SettlementDataSheetFactory.class);
        settlementDataSheetRepository = applicationContext.getRepository(SettlementDataSheetRepository.class);
        zipCodeFactory = applicationContext.getEntityFactory(ZipCodeFactory.class);

        Document doc = getDocument();
        Element root = doc.getRootElement();

        for (Iterator<Element> i = root.elementIterator(ROOT_ELEMENT); i.hasNext();) {
            Element countryElement = i.next();

            Attribute countryNameAttribute = countryElement.attribute(COUNTRY_NAME_ATTRIBUTE);
            String countryName = countryNameAttribute.getValue();

            if (countryName != null && !"".equals(countryName)) {

                Country country = createAndSaveCountry(countryName);

                for (Iterator<Element> j = countryElement.elementIterator(SETTLEMENT_ELEMENT); j.hasNext();) {
                    Element settlementElement = j.next();

                    String settlementName = settlementElement.attribute(SETTLEMENT_NAME_ATTRIBUTE).getValue();
                    if (settlementName != null && !"".equals(settlementName)) {
                        DefaultUnitOfWork work = new DefaultUnitOfWork(true);
                        SettlementDataSheet settlementDataSheet = null;
                        try {

                            settlementDataSheet = createAndSaveSettlement(work, settlementName, country);
                            savedSettlements.add(settlementDataSheet.getSettlement());

                            for (Iterator<Element> k = settlementElement.elementIterator(DISTRICT_ELEMENT); k
                                    .hasNext();) {
                                Element districtElement = k.next();

                                String districtName = districtElement.attribute(DISTRICT_NAME_ATTRIBUTE).getValue();
                                District district = settlementFactory.createDistrict(districtName,
                                        settlementDataSheet.getSettlement());

                                // process ZipCodes
                                for (Iterator<Element> l = districtElement.elementIterator(ZIPCODE_ELEMENT); l
                                        .hasNext();) {
                                    Element zipCodeElement = l.next();
                                    String code = zipCodeElement.attribute(CODE_ATTRIBUTE).getValue();
                                    ZipCode zipCode = zipCodeFactory.createZipCode(new Integer(code), district);
                                }
                            }

                            // process ZipCodes
                            for (Iterator<Element> l = settlementElement.elementIterator(ZIPCODE_ELEMENT); l
                                    .hasNext();) {
                                Element zipCodeElement = l.next();
                                String code = zipCodeElement.attribute(CODE_ATTRIBUTE).getValue();
                                ZipCode zipCode = zipCodeFactory.createZipCode(new Integer(code),
                                        settlementDataSheet.getSettlement());
                            }

                        } catch (Exception e) {
                            logError(e, settlementName);
                        } finally {
                            work.finish();
                            logSuccess(settlementDataSheet.getSettlement());
                        }
                    }
                }
            }
        }
    }

    private SettlementDataSheet createAndSaveSettlement(DefaultUnitOfWork work, String settlementName,
            Country country) {
        SettlementDataSheet settlementDataSheet = settlementDataSheetFactory.create(settlementName,
                country.getName());
        settlementDataSheetRepository.add(work, settlementDataSheet);
        return settlementDataSheet;

    }

    private Country createAndSaveCountry(String countryName) {
        Country country = countryFactory.createCountry(DEFAULT_COUNTRY_NAME);
        DefaultUnitOfWork work = new DefaultUnitOfWork(true);
        countryRepository.add(work, country);
        work.finish();
        return country;

    }

    private void logSuccess(Settlement settlement) {
        log.debug("SettlementDataLoader - load success: " + settlement.getName() + " id: " + settlement.getId());
    }

    private void logError(Exception e, String name) {
        log.error("SettlementDataLoader - FAILED to load: " + name);
        log.error("SettlementDataLoader - Error: " + e.getMessage());
    }

    private void processZipCode(Element element, Settlement settlement) {
        for (Iterator<Element> l = element.elementIterator(ZIPCODE_ELEMENT); l.hasNext();) {

            Element zipCodeElement = l.next();
            String code = zipCodeElement.attribute(CODE_ATTRIBUTE).getValue();

            ZipCode zipCode = zipCodeFactory.createZipCode(new Integer(code), settlement);

        }
    }

    private void saveSettlementDataSheet(DefaultUnitOfWork work, SettlementDataSheet settlementDataSheet) {
        artifactRepository.add(work, settlementDataSheet);
    }
}