/* * * Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved. * * This file is part of Entando software. * Entando is a free software; * You can redistribute it and/or modify it * under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2. * * See the file License for the specific language governing permissions * and limitations under the License * * * * Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved. * */ package com.agiletec.plugins.jpaddressbook.aps.system.services.vcard.util; import info.ineighborhood.cardme.EmailAddress; import info.ineighborhood.cardme.MailingAddress; import info.ineighborhood.cardme.Note; import info.ineighborhood.cardme.PhoneNumber; import info.ineighborhood.cardme.impl.EmailAddressImpl; import info.ineighborhood.cardme.impl.MailingAddressImpl; import info.ineighborhood.cardme.impl.NoteImpl; import info.ineighborhood.cardme.impl.PhoneNumberImpl; import info.ineighborhood.cardme.impl.VCardImpl; import info.ineighborhood.cardme.types.EmailAddressType; import info.ineighborhood.cardme.types.EncodingType; import info.ineighborhood.cardme.types.MailingAddressType; import info.ineighborhood.cardme.types.PhoneNumberType; import info.ineighborhood.cardme.types.Type; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.List; import java.util.logging.Level; import com.agiletec.aps.system.ApsSystemUtils; import com.agiletec.aps.system.common.entity.model.attribute.AttributeInterface; import com.agiletec.aps.system.common.entity.model.attribute.DateAttribute; import com.agiletec.aps.system.common.entity.model.attribute.EnumeratorAttribute; import com.agiletec.aps.system.common.entity.model.attribute.HypertextAttribute; import com.agiletec.aps.system.common.entity.model.attribute.MonoTextAttribute; import com.agiletec.aps.system.common.entity.model.attribute.NumberAttribute; import com.agiletec.aps.system.common.entity.model.attribute.TextAttribute; import com.agiletec.plugins.jpaddressbook.aps.system.JpaddressbookSystemConstants; import com.agiletec.plugins.jpaddressbook.aps.system.services.addressbook.model.IContact; import com.agiletec.plugins.jpaddressbook.aps.system.services.vcard.model.VCardContactField; import com.agiletec.plugins.jpaddressbook.aps.system.services.vcard.parse.VCardAddress; /** * @author A.Cocco */ public class VCardCreator { /** * Create the VCARD * @param contact * @param vcards * @return the VCard */ public String createVCard(IContact contact, List<VCardContactField> vcards) { String vcardMapping = ""; String attributeValue = ""; info.ineighborhood.cardme.VCard vcard = new VCardImpl(); VCardAddress vcardAddress = new VCardAddress(); try { vcard.setVersion(info.ineighborhood.cardme.VCard.VERSION_3_0); vcard.setRevisionDate(Calendar.getInstance()); vcard.setTimeZone(Calendar.getInstance().getTimeZone()); for (int i = 0; i < vcards.size(); i++) { attributeValue = ""; VCardContactField card = vcards.get(i); String profileAttribute = card.getProfileAttribute().trim(); if(card.isEnabled()) { attributeValue = this.getVcardFieldValue(contact, profileAttribute); } String code = card.getCode().trim(); this.setVcardFields(attributeValue, code, vcard, vcardAddress); } vcard.addAddress(this.createAddress(vcardAddress, MailingAddressType.HOME_MAILING_ADDRESS)); vcardMapping = vcard.toString(); } catch (Throwable t) { ApsSystemUtils.logThrowable(t, this, "createVCard"); } return vcardMapping; } private void setVcardFields(String attributeValue, String code, info.ineighborhood.cardme.VCard vcard, VCardAddress vcardAddress) { if(JpaddressbookSystemConstants.VCARD_FIELD_NAME.equals(code)) vcard.setFirstName(attributeValue); if(JpaddressbookSystemConstants.VCARD_FIELD_SURNAME.equals(code)) vcard.setLastName(attributeValue); if(JpaddressbookSystemConstants.VCARD_FIELD_TITLE.equals(code)) vcard.setJobTitle(attributeValue); if(JpaddressbookSystemConstants.VCARD_FIELD_ROLE.equals(code)) vcard.setRole(attributeValue); if(JpaddressbookSystemConstants.VCARD_FIELD_ORG.equals(code)) vcard.setOrganization(attributeValue); if(JpaddressbookSystemConstants.VCARD_FIELD_BDAY.equals(code) && validateDate(attributeValue)) vcard.setBirthday(createBirthday(attributeValue)); if(JpaddressbookSystemConstants.VCARD_FIELD_ADDR_HOME_COUNTRY.equals(code)) vcardAddress.setCountry(attributeValue); if(JpaddressbookSystemConstants.VCARD_FIELD_ADDR_HOME_REGION.equals(code)) vcardAddress.setRegion(attributeValue); if(JpaddressbookSystemConstants.VCARD_FIELD_ADDR_HOME_STREET.equals(code)) vcardAddress.setStreet(attributeValue); if(JpaddressbookSystemConstants.VCARD_FIELD_ADDR_HOME_CITY.equals(code)) vcardAddress.setCity(attributeValue); if(JpaddressbookSystemConstants.VCARD_FIELD_ADDR_HOME_CAP.equals(code)) vcardAddress.setCap(attributeValue); //MailingAddressType.HOME_MAILING_ADDRESS //MailingAddressType.WORK_MAILING_ADDRESS if(JpaddressbookSystemConstants.VCARD_FIELD_TEL_CELL.equals(code)) vcard.addPhoneNumber(createPhoneNumber(attributeValue, PhoneNumberType.CELL_PHONE)); if(JpaddressbookSystemConstants.VCARD_FIELD_TEL_HOME.equals(code)) vcard.addPhoneNumber(createPhoneNumber(attributeValue, PhoneNumberType.HOME_PHONE)); if(JpaddressbookSystemConstants.VCARD_FIELD_TEL_WORK.equals(code)) vcard.addPhoneNumber(createPhoneNumber(attributeValue, PhoneNumberType.WORK_PHONE)); if(JpaddressbookSystemConstants.VCARD_FIELD_TEL_MODEM.equals(code)) vcard.addPhoneNumber(createPhoneNumber(attributeValue, PhoneNumberType.MODEM_NUMBER)); if(JpaddressbookSystemConstants.VCARD_FIELD_TEL_FAX.equals(code)) vcard.addPhoneNumber(createPhoneNumber(attributeValue, PhoneNumberType.FAX_NUMBER)); if(JpaddressbookSystemConstants.VCARD_FIELD_EMAIL_FIRST.equals(code)) vcard.addEmailAddress(createEmailAddress(attributeValue)); if(JpaddressbookSystemConstants.VCARD_FIELD_EMAIL_SECOND.equals(code)) vcard.addEmailAddress(createEmailAddress(attributeValue)); if(JpaddressbookSystemConstants.VCARD_FIELD_EMAIL_THIRD.equals(code)) vcard.addEmailAddress(createEmailAddress(attributeValue)); if(JpaddressbookSystemConstants.VCARD_FIELD_NOTE.equals(code)) vcard.addNote(createNote(attributeValue)); if(JpaddressbookSystemConstants.VCARD_FIELD_URL.equals(code)) vcard.setUrl(attributeValue); } /** * Returns Vcard field value * @param contact * @param profileAttribute */ private String getVcardFieldValue(IContact contact, String profileAttribute) { String attributeValue = ""; if(contact != null){ List<AttributeInterface> attributes = contact.getAttributes(); for (int j = 0; j < attributes.size(); j++) { AttributeInterface attribute = attributes.get(j); String name = attribute.getName(); if(name != null && profileAttribute.equals(name.trim())){ String attributeType = attribute.getType(); attributeValue = this.getAttributeValue(attribute, attributeType); } } } return attributeValue; } /** * Returns the attribute value * @param attribute * @param attributeType */ private String getAttributeValue(AttributeInterface attribute, String attributeType) { String attributeValue = null; if(attributeType != null){ attributeType = attributeType.trim(); if(JpaddressbookSystemConstants.ATTRIBUTE_TYPE_DATE.equals(attributeType)){ DateAttribute dateAttribute = (DateAttribute) attribute; attributeValue = dateAttribute.getFormattedDate("dd/MM/yyyy"); } if(JpaddressbookSystemConstants.ATTRIBUTE_TYPE_ENUMERATOR.equals(attributeType)){ EnumeratorAttribute textAttribute = (EnumeratorAttribute) attribute; attributeValue = textAttribute.getText(); } if(JpaddressbookSystemConstants.ATTRIBUTE_TYPE_HYPERTEXT.equals(attributeType)){ HypertextAttribute hyperTextAttribute = (HypertextAttribute)attribute; attributeValue = hyperTextAttribute.getText(); } if(JpaddressbookSystemConstants.ATTRIBUTE_TYPE_LONGTEXT.equals(attributeType)){ TextAttribute textAttribute = (TextAttribute) attribute; attributeValue = textAttribute.getText(); } if(JpaddressbookSystemConstants.ATTRIBUTE_TYPE_MONOTEXT.equals(attributeType)){ MonoTextAttribute mono = (MonoTextAttribute) attribute; attributeValue = mono.getText(); } if(JpaddressbookSystemConstants.ATTRIBUTE_TYPE_NUMBER.equals(attributeType)){ NumberAttribute numberattribute = (NumberAttribute) attribute; attributeValue = numberattribute.getNumber(); } if(JpaddressbookSystemConstants.ATTRIBUTE_TYPE_TEXT.equals(attributeType)){ TextAttribute textAttribute = (TextAttribute) attribute; attributeValue = textAttribute.getText(); } } return attributeValue; } /** * Create Email Address * @param emailAddress * @return email address */ private static EmailAddress createEmailAddress(String emailAddress){ EmailAddress email = new EmailAddressImpl(); email.addType(EmailAddressType.INTERNET_EMAIL); email.setEmailAddress(emailAddress); return email; } /** * Create phone number * @param phoneNumber * @param phoneLocation * @return phone number */ private static PhoneNumber createPhoneNumber(String phoneNumber, Type phoneLocation){ PhoneNumber phone = new PhoneNumberImpl(); phone.addType(phoneLocation); phone.setLocalNumber(phoneNumber); return phone; } /** * Create the address * @param streetAddress * @param addressLocation * @return the address */ private static MailingAddress createAddress(VCardAddress vcardAddress, Type addressLocation){ MailingAddress address = new MailingAddressImpl(); address.addType(addressLocation); address.setCountry(vcardAddress.getCountry() != null ? vcardAddress.getCountry() : ""); address.setRegion(vcardAddress.getRegion() != null ? vcardAddress.getRegion() : ""); address.setLocality(vcardAddress.getCity() != null ? vcardAddress.getCity() : ""); address.setStreetAddress(vcardAddress.getStreet() != null ? vcardAddress.getStreet() : ""); address.setPostalCode(vcardAddress.getCap() != null ? vcardAddress.getCap() : ""); return address; } /** * Create the birthday * @param year * @param month * @param dayOfMonth * @return the birthday */ private static Calendar createBirthday(String date){ Calendar birthday = Calendar.getInstance(); birthday.clear(); String year = date.substring(6); String month = date.substring(3, 5); String day = date.substring(0, 2); birthday.set(Calendar.YEAR, Integer.valueOf(year)); birthday.set(Calendar.MONTH, Integer.valueOf(month)-1); birthday.set(Calendar.DAY_OF_MONTH, Integer.valueOf(day)); return birthday; } /** * Create note * @param noteContent * @return note */ private static Note createNote(String noteContent){ Note note = new NoteImpl(); note.setEncodingType(EncodingType.QUOTED_PRINTABLE); note.setNote(noteContent); return note; } private static boolean validateDate(String dateString) { DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); java.util.Date date = null; try { df.setLenient(false); date = df.parse(dateString); } catch (Throwable t) { ApsSystemUtils.getLogger().error("The date is not valid." + t.getMessage()); return false; } return true; } }