com.processpuzzle.party.artifact.PersonDataLoader.java Source code

Java tutorial

Introduction

Here is the source code for com.processpuzzle.party.artifact.PersonDataLoader.java

Source

/*
Name: 
- PersonDataLoader
    
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.party.artifact;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

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.Settlement;
import com.processpuzzle.address.domain.SettlementFactory;
import com.processpuzzle.address.domain.SettlementRepository;
import com.processpuzzle.address.domain.ZipCode;
import com.processpuzzle.address.domain.ZipCodeFactory;
import com.processpuzzle.address.domain.ZipCodeRepository;
import com.processpuzzle.application.resource.domain.XmlDataLoader;
import com.processpuzzle.fundamental_types.domain.TimePoint;
import com.processpuzzle.party.domain.AddressFactory;
import com.processpuzzle.party.domain.EmailAddress;
import com.processpuzzle.party.domain.GeographicAddress;
import com.processpuzzle.party.domain.Person;
import com.processpuzzle.party.domain.TelecomAddress;
import com.processpuzzle.party.domain.WebPageAddress;
import com.processpuzzle.persistence.domain.DefaultUnitOfWork;

public class PersonDataLoader extends XmlDataLoader {

    private static final String BUILDING_NUMBER_POSTFIX = "_BuildingNumber";
    private static final String STREET_POSTFIX = "_Street";
    private static final String SETTLEMENT_POSTFIX = "_Settlement";
    private static final String ZIP_CODE_POSTFIX = "_ZipCode";
    private static final String LAND_POSTFIX = "_Land";
    private static final String USED_FOR_POSTFIX = "_UsedFor";
    private static final String GEOG_ADDRESS_ELEMENT_PREFIX = "address";
    private static final String NUMBER_POSTFIX = "_Number";
    private static final String AREA_CODE_POSTFIX = "_AreaCode";
    private static final String COUNTRY_CODE_POSTFIX = "_CountryCode";
    private static final String PHONE_ELEMENT_PREFIX = "phone";
    private static final String EMAIL_ADDRESS_ELEMENT_PREFIX = "emailAddress";
    private static final String WEB_ADDRESS_ELEMENT = "webAddress";
    private static final String BIRTHDAY_ELEMENT = "birthday";
    private static final String GIVEN_NAME_ELEMENT = "givenName";
    private static final String NAME_PREFIX_ELEMENT = "prefix";
    private static final String FAMILY_NAME_ELEMENT = "familyName";
    private static final String ROOT_ELEMENT = "person";
    private static final String DATE_FORMAT_PATTERN = "yyyy.mm.dd.";
    private PersonDataSheetFactory personDataSheetFactory;
    private AddressFactory addressFactory;
    private CountryFactory countryFactory;
    private SettlementFactory settlementFactory;
    private ZipCodeFactory zipCodeFactory;
    private PersonDataSheetRepository artifactRepository;
    private SimpleDateFormat formatter;
    private List<PersonDataSheet> savedPersons = new ArrayList<PersonDataSheet>();

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

        resultInPersistentObjects = true;

        formatter = (SimpleDateFormat) DateFormat.getDateInstance();
        formatter.applyPattern(DATE_FORMAT_PATTERN);
    }

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

        personDataSheetFactory = applicationContext.getEntityFactory(PersonDataSheetFactory.class);
        addressFactory = applicationContext.getEntityFactory(AddressFactory.class);
        countryFactory = applicationContext.getEntityFactory(CountryFactory.class);
        settlementFactory = applicationContext.getEntityFactory(SettlementFactory.class);
        zipCodeFactory = applicationContext.getEntityFactory(ZipCodeFactory.class);
        artifactRepository = applicationContext.getRepository(PersonDataSheetRepository.class);

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

        for (Iterator<Element> i = root.elementIterator(ROOT_ELEMENT); i.hasNext();) {
            DefaultUnitOfWork work = new DefaultUnitOfWork(true);
            Element personElement = (Element) i.next();

            Element familyNameElement = personElement.element(FAMILY_NAME_ELEMENT);
            String familyName = familyNameElement.getText();

            try {
                Element prefixElement = personElement.element(NAME_PREFIX_ELEMENT);
                String prefix = !prefixElement.getText().equals("") ? prefixElement.getText() : null;

                Element givenNameElement = personElement.element(GIVEN_NAME_ELEMENT);
                String givenName = givenNameElement.getText();

                Element birthdayElement = personElement.element(BIRTHDAY_ELEMENT);
                String birthdayStr = birthdayElement.getText();

                TimePoint birthDateTP = null;
                if (birthdayStr != null) {
                    Date birthDate = formatter.parse(birthdayStr);
                    birthDateTP = new TimePoint(birthDate);
                }
                PersonDataSheet personDataSheet = personDataSheetFactory.create(familyName, givenName, birthDateTP);
                personDataSheet.setPrefix(prefix);

                int idx = 1;
                try {

                    while (true) {
                        // create geographic address
                        createGeographicAddress(work, personElement, personDataSheet, idx);

                        // create phone address
                        createPhoneAddress(personElement, personDataSheet, idx);

                        // create email address
                        createEmailAddress(personElement, personDataSheet, idx);

                        idx++;

                    }
                } catch (NullPointerException e) {
                    // nothing serious just while(true) loop ends
                }
                // create webAddress
                createWebAddress(personElement, personDataSheet);

                savePersonDataSheet(work, personDataSheet);
                logSuccess(personDataSheet.getPerson());
                savedPersons.add(personDataSheet);

            } catch (Exception e) {
                logError(e, familyName);
            } finally {
                work.finish();
            }

        }
    }

    private void createWebAddress(Element personElement, PersonDataSheet personDataSheet) {
        Element webAddressElement = personElement.element(WEB_ADDRESS_ELEMENT);
        String webAddressStr = webAddressElement.getText();
        String webPageAddress = !"".equals(webAddressStr) ? webAddressStr : null;

        if (webPageAddress != null) {
            WebPageAddress webAddr = addressFactory.createWebPageAddress(webPageAddress);
            if (webAddr != null) {
                personDataSheet.addAddress(webAddr);
            }
        }
    }

    private void createEmailAddress(Element personElement, PersonDataSheet personDataSheet, int idx) {
        Element emailAddressElement = personElement.element(EMAIL_ADDRESS_ELEMENT_PREFIX + idx);
        if (emailAddressElement != null) {
            String emailStr = emailAddressElement.getText();
            String emailAddress = !"".equals(emailStr) ? emailStr : null;
            if (emailAddress != null) {
                EmailAddress email = addressFactory.createEmailAddress(emailAddress);
                if (email != null) {
                    if (idx == 1) {
                        email.setIsDefault(true);
                    }
                    personDataSheet.addAddress(email);
                }
            }
        }
    }

    private void createPhoneAddress(Element personElement, PersonDataSheet personDataSheet, int idx) {
        String countryCode = null;
        String areaCode = null;
        String number = null;
        Element countryCodeElement = personElement.element(PHONE_ELEMENT_PREFIX + idx + COUNTRY_CODE_POSTFIX);
        if (countryCodeElement != null) {
            String countryCodeStr = countryCodeElement.getText();
            countryCode = !"".equals(countryCodeStr) ? countryCodeStr : null;
        }

        Element areaCodeElement = personElement.element(PHONE_ELEMENT_PREFIX + idx + AREA_CODE_POSTFIX);
        if (areaCodeElement != null) {
            String areaCodeStr = areaCodeElement.getText();
            areaCode = !"".equals(areaCodeStr) ? areaCodeStr : null;
        }

        Element numberElement = personElement.element(PHONE_ELEMENT_PREFIX + idx + NUMBER_POSTFIX);
        if (numberElement != null) {
            String phoneNumberStr = numberElement.getText();
            number = !"".equals(phoneNumberStr) ? phoneNumberStr : null;
        }

        // create phone by factory
        if (!(countryCode == null && areaCode == null && number == null)) {
            TelecomAddress phone = addressFactory.createTelecomAddress(countryCode, areaCode, number);
            if (phone != null) {
                if (idx == 1) {
                    phone.setIsDefault(true);
                }
                personDataSheet.addAddress(phone);
            }
        }
    }

    private void createGeographicAddress(DefaultUnitOfWork work, Element personElement,
            PersonDataSheet personDataSheet, int idx) {
        Element addressUsedForElement = personElement.element(GEOG_ADDRESS_ELEMENT_PREFIX + idx + USED_FOR_POSTFIX);
        String addressUsedFor = addressUsedForElement.getText();

        Element addressLandElement = personElement.element(GEOG_ADDRESS_ELEMENT_PREFIX + idx + LAND_POSTFIX);
        String land = addressLandElement.getText();
        String addressLand = !"".equals(land) ? land : null;

        if (addressLand != null) {

            String addressZipCode = null;
            Element addressZipCodeElement = personElement
                    .element(GEOG_ADDRESS_ELEMENT_PREFIX + idx + ZIP_CODE_POSTFIX);
            if (addressZipCodeElement != null) {
                String zipCodeStr = addressZipCodeElement.getText();
                addressZipCode = !"".equals(zipCodeStr) ? zipCodeStr : null;
            }

            String addressSettlement = null;
            Element addressSettlementElement = personElement
                    .element(GEOG_ADDRESS_ELEMENT_PREFIX + idx + SETTLEMENT_POSTFIX);
            if (addressSettlementElement != null) {
                String settlementName = addressSettlementElement.getText();
                addressSettlement = !"".equals(settlementName) ? settlementName : null;
            }

            Settlement settlement = null;
            if (addressSettlement != null) {
                settlement = findOrCreateSettlement(work, addressSettlement, addressLand);
            }

            ZipCode zipCode = null;
            if (addressZipCode != null && !"".equals(addressZipCode) && settlement != null) {
                Integer zipCodeInteger = new Integer(addressZipCode);
                zipCode = findOrCreateZipcode(work, zipCodeInteger, settlement);
            }

            String addressStreet = null;
            Element addressStreetElement = personElement
                    .element(GEOG_ADDRESS_ELEMENT_PREFIX + idx + STREET_POSTFIX);
            if (addressStreetElement != null) {
                String street = addressStreetElement.getText();
                addressStreet = !"".equals(street) ? street : null;
            }

            String addressBuildingNumber = null;
            Element addressBuildingNumberElement = personElement
                    .element(GEOG_ADDRESS_ELEMENT_PREFIX + idx + BUILDING_NUMBER_POSTFIX);
            if (addressBuildingNumberElement != null) {
                String buildingNumber = addressBuildingNumberElement.getText();
                addressBuildingNumber = !"".equals(buildingNumber) ? buildingNumber : null;
            }

            if (!(addressStreet == null && addressBuildingNumber == null && zipCode == null
                    && settlement == null)) {
                GeographicAddress address = addressFactory.createGeographicAddress(addressStreet,
                        addressBuildingNumber, zipCode, settlement);
                if (address != null) {
                    if (idx == 1) {
                        address.setIsDefault(true);
                    }
                    if (addressUsedFor != null) {
                        address.setUsedFor(addressUsedFor);
                    }

                    personDataSheet.addAddress(address);
                }
            }

        }
    }

    public List<PersonDataSheet> getSavedPeople() {
        return savedPersons;
    }

    private ZipCode findOrCreateZipcode(DefaultUnitOfWork work, Integer zipCodeInteger, Settlement settlement) {
        ZipCodeRepository zipCodeRepository = applicationContext.getRepository(ZipCodeRepository.class);

        ZipCode zipCode = zipCodeRepository.findByIdentityExpression(work, zipCodeInteger, settlement.getName());
        if (zipCode == null) {
            zipCode = zipCodeFactory.createZipCode(zipCodeInteger, settlement);
        }
        return zipCode;
    }

    private Settlement findOrCreateSettlement(DefaultUnitOfWork work, String settlementName, String countryName) {
        Settlement settlement = null;
        CountryRepository countryRepository = applicationContext.getRepository(CountryRepository.class);
        SettlementRepository settlementRepository = applicationContext.getRepository(SettlementRepository.class);

        Country country = findOrCreateCountry(work, countryName, countryRepository);

        settlement = settlementRepository.findSettlementByNameAndCountryName(work, settlementName, countryName);

        if (settlement == null) {
            settlement = settlementFactory.createSettlement(settlementName, country);
            settlementRepository.add(work, settlement);
        }
        return settlement;
    }

    private Country findOrCreateCountry(DefaultUnitOfWork work, String countryName,
            CountryRepository countryRepository) {
        Country country = countryRepository.findCountryByName(work, countryName);
        if (country == null) {
            country = countryFactory.createCountry(countryName);
            countryRepository.add(work, country);
        }
        return country;
    }

    private void savePersonDataSheet(DefaultUnitOfWork work, PersonDataSheet personDataSheet) {
        artifactRepository.add(work, personDataSheet);
        log.trace("PersonDataSheet: '" + personDataSheet.getName() + "' saved.");
    }

    private void logSuccess(Person person) {
        log.debug(
                "PersonDataLoader - load success: " + person.getPersonName().getName() + " id: " + person.getId());
    }

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