/* Name: - CompanyDataLoader 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.util.ArrayList; 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.party.domain.AddressFactory; import com.processpuzzle.party.domain.Company; import com.processpuzzle.party.domain.EmailAddress; import com.processpuzzle.party.domain.GeographicAddress; import com.processpuzzle.party.domain.TelecomAddress; import com.processpuzzle.party.domain.WebPageAddress; import com.processpuzzle.persistence.domain.DefaultUnitOfWork; public class CompanyDataLoader 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 ROOT_ELEMENT = "company"; private static final String SHORT_NAME_ELEMENT = "shortName"; private static final String LONG_NAME_ELEMENT = "longName"; private static final String WEB_ADDRESS_ELEMENT = "webAddress"; private CompanyDataSheetFactory companyDataSheetFactory; private AddressFactory addressFactory; private CountryFactory countryFactory; private SettlementFactory settlementFactory; private ZipCodeFactory zipCodeFactory; private CompanyDataSheetRepository artifactRepository; private List<CompanyDataSheet> savedCompanies = new ArrayList<CompanyDataSheet>(); public CompanyDataLoader(String sourcePath, String schemePath ) { super(sourcePath, schemePath); resultInPersistentObjects = true; } public @Override @SuppressWarnings("unchecked") void loadData() { super.loadData(); companyDataSheetFactory = applicationContext.getEntityFactory( CompanyDataSheetFactory.class ); addressFactory = applicationContext.getEntityFactory( AddressFactory.class ); countryFactory = applicationContext.getEntityFactory( CountryFactory.class ); settlementFactory = applicationContext.getEntityFactory( SettlementFactory.class ); zipCodeFactory = applicationContext.getEntityFactory( ZipCodeFactory.class ); artifactRepository = applicationContext.getRepository(CompanyDataSheetRepository.class); Document doc = getDocument(); Element root = doc.getRootElement(); for (Iterator<Element> i = root.elementIterator(ROOT_ELEMENT); i.hasNext();) { DefaultUnitOfWork work = new DefaultUnitOfWork(true); Element companyElement = (Element) i.next(); Element shortNameElement = companyElement.element( SHORT_NAME_ELEMENT ); String shortName = shortNameElement.getText(); try { Element longNameElement = companyElement.element( LONG_NAME_ELEMENT ); String longName = longNameElement.getText(); CompanyDataSheet companyDataSheet = companyDataSheetFactory.create( longName ); int idx = 1; try { while(true) { // create geographic address createGeographicAddress( work, companyElement, companyDataSheet, idx ); // create phone address createPhoneAddress( companyElement, companyDataSheet, idx ); // create email address createEmailAddress( companyElement, companyDataSheet, idx ); idx++; } //while } catch (NullPointerException e) { // nothing serious just while(true) loop ends } //create webAddress createWebAddress( companyElement, companyDataSheet); if ( companyDataSheet != null ) { saveCompanyDataSheet( work, companyDataSheet ); logSuccess( companyDataSheet.getCompany() ); savedCompanies.add( companyDataSheet ); } } catch( Exception e) { logError( e, shortName); } finally { work.finish(); } } //end for } private void createWebAddress( Element element, CompanyDataSheet companyDataSheet ) { Element webAddressElement = element.element( WEB_ADDRESS_ELEMENT ); if ( webAddressElement != null ) { String webAddressStr = webAddressElement.getText(); String webPageAddress = !"".equals( webAddressStr ) ? webAddressStr : null; if ( webPageAddress != null ) { WebPageAddress webAddr = addressFactory.createWebPageAddress( webPageAddress ); if (webAddr != null) { companyDataSheet.addAddress( webAddr ); } } } } private void createEmailAddress( Element element, CompanyDataSheet companyDataSheet, int idx ) { Element emailAddressElement = element.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 ); } companyDataSheet.addAddress( email ); } } } } private void createPhoneAddress( Element element, CompanyDataSheet companyDataSheet, int idx ) { String countryCode = null; String areaCode = null; String number = null; Element countryCodeElement = element.element( PHONE_ELEMENT_PREFIX + idx +COUNTRY_CODE_POSTFIX ); if ( countryCodeElement != null ) { String countryCodeStr = countryCodeElement.getText(); countryCode = !"".equals( countryCodeStr ) ? countryCodeStr : null; } Element areaCodeElement = element.element( PHONE_ELEMENT_PREFIX + idx +AREA_CODE_POSTFIX ); if ( areaCodeElement != null ) { String areaCodeStr = areaCodeElement.getText(); areaCode = !"".equals( areaCodeStr ) ? areaCodeStr : null; } Element numberElement = element.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 ); } companyDataSheet.addAddress( phone ); } } } private void createGeographicAddress( DefaultUnitOfWork work, Element element, CompanyDataSheet companyDataSheet, int idx ) { Element addressUsedForElement = element.element( GEOG_ADDRESS_ELEMENT_PREFIX + idx + USED_FOR_POSTFIX ); String addressUsedFor = addressUsedForElement.getText(); Element addressLandElement = element.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 = element.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 = element.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 = element.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 = element.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 ); } companyDataSheet.addAddress( address ); } } } } 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 = countryRepository.findCountryByName( work, countryName ); if ( country == null ) { country = countryFactory.createCountry( countryName ); countryRepository.add( work, country ); } settlement = settlementRepository.findSettlementByNameAndCountryName( work, settlementName, countryName ); if ( settlement == null ) { settlement = settlementFactory.createSettlement( settlementName, country ); settlementRepository.add( work, settlement ); } return settlement; } private void saveCompanyDataSheet( DefaultUnitOfWork work, CompanyDataSheet companyDataSheet ) { // log.debug("CampoanyDataLoader - companyDataSheet.getName(): " + companyDataSheet.getName()); artifactRepository.add( work, companyDataSheet ); } public List<CompanyDataSheet> getSavedCompanies() { return savedCompanies; } private void logSuccess( Company company ) { // log.debug("CompanyDataLoader - load success: " + company.getName() + " id: " + company.getId()); } private void logError( Exception e, String name ) { log.error("CompanyDataLoader - FAILED to load: " + name); log.error("CompanyDataLoader - Error: " + e.getMessage()); e.printStackTrace(); } }