Package org.projectforge.web.address

Source Code of org.projectforge.web.address.AddressImportForm

/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition 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; version 3 of the License.
//
// This community edition 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 org.projectforge.web.address;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import net.fortuna.ical4j.data.ParserException;
import net.fortuna.ical4j.vcard.Parameter;
import net.fortuna.ical4j.vcard.Parameter.Id;
import net.fortuna.ical4j.vcard.Property;
import net.fortuna.ical4j.vcard.VCard;
import net.fortuna.ical4j.vcard.VCardBuilder;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.model.PropertyModel;
import org.joda.time.DateTime;
import org.projectforge.address.AddressDO;
import org.projectforge.address.AddressStatus;
import org.projectforge.address.ContactStatus;
import org.projectforge.address.FormOfAddress;
import org.projectforge.web.wicket.AbstractEditForm;
import org.projectforge.web.wicket.bootstrap.GridSize;
import org.projectforge.web.wicket.flowlayout.FieldsetPanel;
import org.projectforge.web.wicket.flowlayout.FileUploadPanel;

/**
* @author M. Lauterbach (m.lauterbach@micromata.de)
*
*/
public class AddressImportForm extends AbstractEditForm<AddressDO, AddressImportPage>
{
  private static final long serialVersionUID = -1691614676645602272L;

  private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(AddressImportForm.class);

  private final List<FileUpload> uploads = new LinkedList<FileUpload>();

  /**
   * @param parentPage
   * @param data
   */
  public AddressImportForm(final AddressImportPage parentPage, final AddressDO data)
  {
    super(parentPage, data);
  }

  /**
   * @see org.apache.wicket.Component#onInitialize()
   */
  @Override
  protected void onInitialize()
  {
    super.onInitialize();
    gridBuilder.newSplitPanel(GridSize.COL50);
    final FieldsetPanel newFieldset = gridBuilder.newFieldset(getString("address.book.vCardImport.fileUploadPanel"));

    final FileUploadField uploadField = new FileUploadField(FileUploadPanel.WICKET_ID, new PropertyModel<List<FileUpload>>(this, "uploads"));
    newFieldset.add(new FileUploadPanel(newFieldset.newChildId(), uploadField));
  }

  /**
   * @see org.projectforge.web.wicket.AbstractEditForm#getLogger()
   */
  @Override
  protected Logger getLogger()
  {
    return log;
  }

  @SuppressWarnings("serial")
  public void create()
  {
    if (uploads != null) {
      final FileUpload upload = uploads.get(0);
      if (upload.getClientFileName().endsWith(".vcf") == false) {
        feedbackPanel.error(getString("address.book.vCardImport.wrongFileType"));
      } else {
        try {
          final File file = upload.writeToTempFile();
          final List<AddressDO> newAddresses = new ArrayList<AddressDO>();

          final FileInputStream fis = new FileInputStream(file);
          final VCardBuilder builder = new VCardBuilder(fis);

          AddressDO newAddress = null;
          for (final VCard card : builder.buildAll()) {
            newAddress = new AddressDO();

            // //// SET BASE DATA
            if (card.getProperty(net.fortuna.ical4j.vcard.Property.Id.N) != null) {
              setName(card.getProperty(net.fortuna.ical4j.vcard.Property.Id.N), newAddress);
            }
            if (card.getProperty(net.fortuna.ical4j.vcard.Property.Id.ORG) != null) {
              setOrganization(card.getProperty(net.fortuna.ical4j.vcard.Property.Id.ORG), newAddress);
            }
            if (card.getProperty(net.fortuna.ical4j.vcard.Property.Id.BDAY) != null) {
              setBirth(card.getProperty(net.fortuna.ical4j.vcard.Property.Id.BDAY), newAddress);
            }
            if (card.getProperty(net.fortuna.ical4j.vcard.Property.Id.NOTE) != null) {
              setNote(card.getProperty(net.fortuna.ical4j.vcard.Property.Id.NOTE), newAddress);
            }

            // //// SET ADDITIONAL DATA
            final List<Property> li = card.getProperties();
            setProperties(li, newAddress);

            // handle item entries
            final VCardItemElementHandler ih = new VCardItemElementHandler(new FileInputStream(file));
            if (!ih.getItemList().isEmpty())
              setProperties(ih.getItemList(), newAddress);

            newAddress.setAddressStatus(AddressStatus.UPTODATE);
            newAddress.setDeleted(false);
            newAddress.setLastUpdate(DateTime.now().toDate());
            newAddress.setCreated(DateTime.now().toDate());
            newAddress.setContactStatus(ContactStatus.ACTIVE);
            newAddress.setForm(FormOfAddress.UNKNOWN);

            // //// CHECK IF THERE IS SOMETHING MORE TO ADD
            if (newAddress.getAddressText() == null || newAddress.getAddressText() == "") {
              setOtherPropertiesToWork(li, newAddress);
              if (!ih.getItemList().isEmpty() && newAddress.getAddressText() == null || newAddress.getAddressText() == "") {
                setOtherPropertiesToWork(ih.getItemList(), newAddress);
              }
            } else if (newAddress.getPrivateAddressText() == null || newAddress.getPrivateAddressText() == "") {
              setOtherPropertiesToPrivate(li, newAddress);
              if (!ih.getItemList().isEmpty() && newAddress.getPostalAddressText() == null || newAddress.getPostalAddressText() == "")
                setOtherPropertiesToPrivate(ih.getItemList(), newAddress);
            } else {
              setPostalProperties(li, newAddress);
              if (!ih.getItemList().isEmpty() && newAddress.getPostalAddressText() == null || newAddress.getPostalAddressText() == "")
                setPostalProperties(ih.getItemList(), newAddress);
            }
            newAddresses.add(newAddress);
          }

          for (final AddressDO address : newAddresses) {
            getBaseDao().save(address);
          }

          // /// CHECK FOR EXISTING ENTRIES
          // TODO shift to dao
          //          final BaseSearchFilter af = new BaseSearchFilter();
          //          af.setSearchString(getSearchString(newAddress));
          //          final AddressDao dao = (AddressDao) getBaseDao();
          //          final QueryFilter queryFilter = new QueryFilter(af);
          //          final List<AddressDO> list = dao.internalGetList(queryFilter);

          // //// SAVING
          /*
           * if list is > 0 there are entries with equal information.
           */
          //          if (list.size() == 0) {
          //            final PageParameters params = new PageParameters();
          //
          //            // inner class to set the right return page.
          //            //            @EditPage(defaultReturnPage = AddressListPage.class)
          //            class MyEditPage extends AddressListPage
          //            {
          //
          //              /**
          //               * @param parameters
          //               */
          //              public MyEditPage(final PageParameters parameters)
          //              {
          //                super(parameters);
          //              }
          //
          //              /**
          //               * @see org.projectforge.web.wicket.AbstractEditPage#init(org.projectforge.core.AbstractBaseDO)
          //               */
          //              @Override
          //              protected void init()
          //              {
          //                super.init();
          //                data = AddressImportForm.this.getData();
          //              }
          //            }
          //            //            final AddressListPage listPage = new AddressListPage(params);
          //            //            final AddressEditPage addressEditPage = new Address//new MyEditPage(params);
          //            //                addressEditPage.newEditForm(parentPage, getData());
          //            setResponsePage(new MyEditPage(params));
          //          } else {
          //            // compare new with first match
          //            setResponsePage(new AddressComparePage(getPage().getPageParameters(), data, list.get(0)));
          //          }
        } catch (final IOException ex) {
          log.fatal("Exception encountered " + ex, ex);
        } catch (final ParserException ex) {
          log.fatal("Exception encountered " + ex, ex);
        }
      }
    } else
      feedbackPanel.error(getString("address.book.vCardImport.noFile"));
  }

  /**
   * @return
   */
  private String getSearchString(final AddressDO address)
  {
    // default search string
    String searchString = address.getName() + " " + address.getFirstName() + " ";

    // extended search string
    if (address.getMobilePhone() != null && address.getMobilePhone() != "") {
      searchString += "\"" + address.getMobilePhone() + "\"" + " ";
    }
    if (address.getEmail() != null && address.getEmail() != "") {
      searchString += address.getEmail() + " ";
    }
    if (address.getBusinessPhone() != null && address.getBusinessPhone() != "") {
      searchString += "\"" + address.getBusinessPhone() + "\"" + " ";
    }
    if (address.getPrivateEmail() != null && address.getPrivateEmail() != "") {
      searchString += address.getPrivateEmail() + " ";
    }
    return searchString;
  }

  /**
   * @param property
   */
  private void setNote(final Property property, final AddressDO address)
  {
    address.setComment(property.getValue());
  }

  /**
   * @param li
   */
  private void setProperties(final List<Property> li, final AddressDO address)
  {
    for (final Property property : li) {
      final List<Parameter> lii = property.getParameters(Id.TYPE);
      for (final Parameter param : lii) {
        if (param.getValue().equals("HOME"))
          setHomeData(property, address);
        else if (param.getValue().equals("WORK"))
          setWorkData(property, address);
      }
    }
  }

  private void setPostalProperties(final List<Property> li, final AddressDO address)
  {
    for (final Property property : li) {
      final List<Parameter> lii = property.getParameters(Id.TYPE);
      for (final Parameter param : lii) {
        if (param.getValue().equals("OTHER")) {
          // ////SET WORK ADDRESS
          if (property.getId().toString().equals("ADR")) {
            final String str[] = StringUtils.split(property.getValue(), ';');
            final int size = str.length;
            if (size >= 1)
              address.setPostalAddressText(str[0]);
            if (size >= 2)
              address.setPostalCity(str[1]);
            if (size >= 3)
              address.setPostalZipCode(str[2]);
            if (size >= 4)
              address.setPostalCountry(str[3]);
            if (size >= 5)
              address.setPostalState(str[4]);
          }
        }
      }
    }
  }

  private void setOtherPropertiesToWork(final List<Property> li, final AddressDO address)
  {
    for (final Property property : li) {
      final List<Parameter> lii = property.getParameters(Id.TYPE);
      for (final Parameter param : lii) {
        if (param.getValue().equals("OTHER")) {
          // ////SET WORK ADDRESS
          if (property.getId().toString().equals("ADR")) {
            final String str[] = StringUtils.split(property.getValue(), ';');
            final int size = str.length;
            if (size >= 1)
              address.setAddressText(str[0]);
            if (size >= 2)
              address.setCity(str[1]);
            if (size >= 3)
              address.setZipCode(str[2]);
            if (size >= 4)
              address.setCountry(str[3]);
            if (size >= 5)
              address.setState(str[4]);
          }
        }
      }
    }
  }

  private void setOtherPropertiesToPrivate(final List<Property> li, final AddressDO address)
  {
    for (final Property property : li) {
      final List<Parameter> lii = property.getParameters(Id.TYPE);
      for (final Parameter param : lii) {
        if (param.getValue().equals("OTHER")) {
          // //// SET HOME ADDRESS
          if (property.getId().toString().equals("ADR")) {
            final String str[] = StringUtils.split(property.getValue(), ';');
            final int size = str.length;
            // street
            if (size >= 1)
              address.setPrivateAddressText(str[0]);
            // city
            if (size >= 2)
              address.setPrivateCity(str[1]);
            // zip code
            if (size >= 3)
              address.setPrivateZipCode(str[2]);
            // country
            if (size >= 4)
              address.setPrivateCountry(str[3]);
            // state
            if (size >= 5)
              address.setPrivateState(str[4]);
          }
        }
      }
    }
  }

  /**
   * @param property
   */
  private void setBirth(final Property property, final AddressDO address)
  {
    if (property != null)
      address.setBirthday(new Date(DateTime.parse(property.getValue()).getMillis()));
  }

  private void setName(final Property property, final AddressDO address)
  {
    final String str[] = StringUtils.split(property.getValue(), ';');
    address.setName(str[0]);
    address.setFirstName(str[1]);
    if (str.length >= 3)
      address.setTitle(str[2]);
  }

  private void setOrganization(final Property property, final AddressDO address)
  {
    final String org = StringUtils.substringBefore(property.getValue(), ";");
    address.setOrganization(org);
    final String division = StringUtils.substringAfter(property.getValue(), ";");
    address.setDivision(division);
  }

  /**
   * Create home newAddress
   *
   * @param property
   */
  private void setHomeData(final Property property, final AddressDO address)
  {
    boolean telCheck = true; // to seperate phone and mobil number
    // //// SET HOME EMAIL
    if (property.getId().toString().equals("EMAIL"))
      address.setPrivateEmail(property.getValue());

    // //// SET HOME PHONE
    if (property.getId().toString().equals("TEL")) {
      final List<Parameter> list = property.getParameters();
      for (final Parameter p : list) {
        if (p.getValue().toString().equals("VOICE")) {
          final String tel = getTel(property.getValue());

          // phone number first, mobil number second
          if (telCheck) {
            address.setPrivatePhone(tel);
            telCheck = false;
            break;
          } else {
            address.setPrivateMobilePhone(tel);
            break;
          }
        }
        if (address.getPrivatePhone() == null && property.toString().contains("FAX") == false) {
          address.setPrivatePhone(getTel(property.getValue()));
        } else {
          if (address.getPrivateMobilePhone() == null && property.toString().contains("FAX") == false) {
            address.setPrivateMobilePhone(getTel(property.getValue()));
          }
        }
      }
    }

    // //// SET FAX -> no private fax

    // //// SET HOME ADDRESS
    if (property.getId().toString().equals("ADR")) {
      final String str[] = StringUtils.split(property.getValue(), ';');
      final int size = str.length;
      if (size >= 1)
        address.setPrivateAddressText(str[0]);
      if (size >= 2)
        address.setPrivateCity(str[1]);
      if (size >= 3)
        address.setPrivateZipCode(str[2]);
      if (size >= 4)
        address.setPrivateCountry(str[3]);
      if (size >= 5)
        address.setPrivateState(str[4]);
    }

    // //// SET HOME URL -> no space for home url
  }

  /**
   * @param property
   * @return
   */
  private String getTel(String tel)
  {
    if (tel.startsWith("0")) {
      tel = "+49 " + tel.substring(1);
    } else {
      if (!tel.startsWith("+"))
        tel = "+49 " + tel;
    }
    return tel;
  }

  private void setWorkData(final Property property, final AddressDO address)
  {
    boolean telCheck = true; // to seperate phone and mobil number

    // //// SET WORK PHONE
    if (property.getId().toString().equals("TEL")) {
      final List<Parameter> list = property.getParameters();
      for (final Parameter p : list) {
        if (p.getValue().toString().equals("VOICE")) {
          final String tel = getTel(property.getValue());

          // phone number first, mobil number second
          if (telCheck) {
            address.setBusinessPhone(tel);
            telCheck = false;
            break;
          } else {
            address.setMobilePhone(tel);
            break;
          }
        }
        // //// SET WORK FAX
        if (p.getValue().toString().equals("FAX")) {
          address.setFax(getTel(property.getValue()));
        }
        if (address.getBusinessPhone() == null && property.toString().contains("FAX") == false) {
          address.setBusinessPhone(getTel(property.getValue()));
        } else {
          if (address.getMobilePhone() == null && property.toString().contains("FAX") == false) {
            address.setMobilePhone(getTel(property.getValue()));
          }
        }
      }
    }

    // //// SET WORK EMAIL
    if (property.getId().toString().equals("EMAIL"))
      address.setEmail(property.getValue());

    // //// SET WORK ADDRESS
    if (property.getId().toString().equals("ADR")) {
      final String str[] = StringUtils.split(property.getValue(), ';');
      final int size = str.length;
      if (size >= 1)
        address.setAddressText(str[0]);
      if (size >= 2)
        address.setCity(str[1]);
      if (size >= 3)
        address.setZipCode(str[2]);
      if (size >= 4)
        address.setCountry(str[3]);
      if (size >= 5)
        address.setState(str[4]);
    }

    // //// SET WORK URL
    if (property.getId().toString().equals("URL"))
      address.setWebsite(property.getValue());
  }
}
TOP

Related Classes of org.projectforge.web.address.AddressImportForm

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.