Package calendarexportplugin.exporter

Source Code of calendarexportplugin.exporter.GoogleExporter

/*
* 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 2
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*
* CVS information:
*  $RCSfile$
*   $Source$
*     $Date: 2005-12-26 21:46:18 +0100 (Mo, 26 Dez 2005) $
*   $Author: troggan $
* $Revision: 1764 $
*/
package calendarexportplugin.exporter;

import java.awt.Window;
import java.io.IOException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

import javax.swing.JOptionPane;

import org.apache.commons.lang.StringUtils;

import util.exc.ErrorHandler;
import util.io.IOUtilities;
import util.paramhandler.ParamParser;
import util.program.AbstractPluginProgramFormating;
import util.ui.Localizer;
import util.ui.login.LoginDialog;
import calendarexportplugin.CalendarExportPlugin;
import calendarexportplugin.CalendarExportSettings;
import calendarexportplugin.utils.CalendarToolbox;

import com.google.gdata.client.GoogleService;
import com.google.gdata.client.Query;
import com.google.gdata.data.DateTime;
import com.google.gdata.data.PlainTextConstruct;
import com.google.gdata.data.calendar.CalendarEventEntry;
import com.google.gdata.data.calendar.CalendarEventFeed;
import com.google.gdata.data.extensions.BaseEventEntry;
import com.google.gdata.data.extensions.EventEntry;
import com.google.gdata.data.extensions.Reminder;
import com.google.gdata.data.extensions.When;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;

import devplugin.Program;

/**
* Exporter for Google Calendar API
*
* @author bodum
*/
public class GoogleExporter extends AbstractExporter {
  /**
   * Translator
   */
  private static final Localizer mLocalizer = Localizer.getLocalizerFor(GoogleExporter.class);

  protected static final String USERNAME = "Google_Username";
  private static final String PASSWORD = "Google_Password";
  protected static final String STORE_PASSWORD = "Google_StorePassword";
  protected static final String STORE_SETTINGS = "Google_StoreSettgins";
  protected static final String SELECTED_CALENDAR = "Google_SelectedCalendar";
  protected static final String REMINDER = "Google_Reminder";
  protected static final String REMINDER_MINUTES = "Google_ReminderMinutes";
  protected static final String REMINDER_SMS = "Google_ReminderSMS";
  protected static final String REMINDER_EMAIL = "Google_ReminderEMAIL";
  protected static final String REMINDER_ALERT = "Google_ReminderAlert";

  private String mPassword = "";

  public String getName() {
    return mLocalizer.msg("name", "Google Calendar");
  }

  public boolean exportPrograms(Program[] programs, CalendarExportSettings settings, AbstractPluginProgramFormating formatting) {
    try {
      boolean uploadedItems = false;
      mPassword = IOUtilities.xorDecode(settings.getExporterProperty(PASSWORD), 345903).trim();

      if (!settings.getExporterProperty(STORE_PASSWORD, false)) {
        if (!showLoginDialog(settings)) {
          return false;
        }
      }

      if (!settings.getExporterProperty(STORE_SETTINGS, false)) {
        if (!showCalendarSettings(settings)) {
          return false;
        }
      }

      GoogleService myService = new GoogleService("cl", "tvbrowser-tvbrowsercalenderplugin-" + CalendarExportPlugin.getInstance().getInfo().getVersion().toString());
      myService.setUserCredentials(settings.getExporterProperty(USERNAME).trim(), mPassword);

      URL postUrl =
              new URL("http://www.google.com/calendar/feeds/" + settings.getExporterProperty(SELECTED_CALENDAR) + "/private/full");

      SimpleDateFormat formatDay = new SimpleDateFormat("yyyy-MM-dd");
      formatDay.setTimeZone(TimeZone.getTimeZone("GMT"));
      SimpleDateFormat formatTime = new SimpleDateFormat("HH:mm:ss");
      formatTime.setTimeZone(TimeZone.getTimeZone("GMT"));

      ParamParser parser = new ParamParser();
      for (Program program : programs) {
        final String title = parser.analyse(formatting.getTitleValue(), program);

        // First step: search for event in calendar
        boolean createEvent = true;

        CalendarEventEntry entry = findEntryForProgram(myService, postUrl, title, program);

        if (entry != null) {
          int ret = JOptionPane.showConfirmDialog(null, mLocalizer.msg("alreadyAvailable", "already available", program.getTitle()), mLocalizer.msg("title", "Add event?"),  JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

          if (ret != JOptionPane.YES_OPTION) {
            createEvent = false;
          }
        }

        // add event to calendar
        if (createEvent) {
          EventEntry myEntry = new EventEntry();

          myEntry.setTitle(new PlainTextConstruct(title));

          String desc = parser.analyse(formatting.getContentValue(), program);
          myEntry.setContent(new PlainTextConstruct(desc));

          Calendar c = CalendarToolbox.getStartAsCalendar(program);

          DateTime startTime = new DateTime(c.getTime(), c.getTimeZone());

          c = CalendarToolbox.getEndAsCalendar(program);

          DateTime endTime = new DateTime(c.getTime(), c.getTimeZone());

          When eventTimes = new When();

          eventTimes.setStartTime(startTime);
          eventTimes.setEndTime(endTime);

          myEntry.addTime(eventTimes);

          if (settings.getExporterProperty(REMINDER, false)) {
            int reminderMinutes = 0;

            try {
              reminderMinutes = settings.getExporterProperty(REMINDER_MINUTES, 0);
            } catch (NumberFormatException e) {
              e.printStackTrace();
            }

            if (settings.getExporterProperty(REMINDER_ALERT, false)) {
              addReminder(myEntry, reminderMinutes, Reminder.Method.ALERT);
            }

            if (settings.getExporterProperty(REMINDER_EMAIL, false)) {
              addReminder(myEntry, reminderMinutes, Reminder.Method.EMAIL);
            }

            if (settings.getExporterProperty(REMINDER_SMS, false)) {
              addReminder(myEntry, reminderMinutes, Reminder.Method.SMS);
            }

          }

          if (settings.isShowBusy()) {
              myEntry.setTransparency(BaseEventEntry.Transparency.OPAQUE);
          }
          else {
              myEntry.setTransparency(BaseEventEntry.Transparency.TRANSPARENT);
          }
          // Send the request and receive the response:
          myService.insert(postUrl, myEntry);
          uploadedItems = true;
        }
      }

      if (uploadedItems) {
        JOptionPane.showMessageDialog(CalendarExportPlugin.getInstance().getBestParentFrame(), mLocalizer.msg("exportDone", "Google Export done."), mLocalizer.msg("export", "Export"), JOptionPane.INFORMATION_MESSAGE);
      }

      return true;
    } catch (AuthenticationException e) {
      ErrorHandler.handle(mLocalizer.msg("loginFailure", "Problems during login to Service.\nMaybe bad username or password?"), e);
      settings.setExporterProperty(STORE_PASSWORD, false);
    } catch (Exception e) {
      ErrorHandler.handle(mLocalizer.msg("commError", "Error while communicating with Google!"), e);
    }

    return false;
  }

  private CalendarEventEntry findEntryForProgram(GoogleService myService, URL postUrl, String title, Program program) throws IOException, ServiceException {
    Calendar c = CalendarToolbox.getStartAsCalendar(program);
    DateTime startTime = new DateTime(c.getTime(), c.getTimeZone());

    Query myQuery = new Query(postUrl);
    myQuery.setFullTextQuery(title);
    CalendarEventFeed myResultsFeed = myService.query(myQuery, CalendarEventFeed.class);

    for (CalendarEventEntry entry : myResultsFeed.getEntries()) {
      if ((entry.getTimes().size() > 0) && (entry.getTimes().get(0).getStartTime().getValue() == startTime.getValue())) {
        return entry;
      }
    }

    return null;
  }

  /**
   * Create new Reminder
   *
   * @param myEntry         add Reminder to this Entry
   * @param reminderMinutes Remind x Minutes before event
   * @param method          what method to use
   */
  private void addReminder(EventEntry myEntry, int reminderMinutes, Reminder.Method method) {
    Reminder reminder = new Reminder();
    reminder.setMinutes(reminderMinutes);
    reminder.setMethod(method);
    myEntry.getReminder().add(reminder);
  }

  /**
   * Show the Settings Dialog for the exporter
   *
   * @param settings Settings
   * @return true, if ok was pressed
   * @throws IOException      Exception during connection
   * @throws ServiceException Problems with the google service
   */
  private boolean showCalendarSettings(CalendarExportSettings settings) throws IOException, ServiceException {
    GoogleSettingsDialog settingsDialog;

    Window wnd = CalendarExportPlugin.getInstance().getBestParentFrame();
    settingsDialog = new GoogleSettingsDialog(wnd, settings, mPassword);

    return settingsDialog.showDialog() == JOptionPane.OK_OPTION;

  }

  /**
   * Show the Login-Dialog
   *
   * @param settings
   *          Settings to use for this Dialog
   * @return true, if successful
   */
  private boolean showLoginDialog(CalendarExportSettings settings) {
    LoginDialog login;

    Window parent = CalendarExportPlugin.getInstance().getBestParentFrame();

    login = new LoginDialog(parent, settings.getExporterProperty(USERNAME),
        IOUtilities.xorDecode(settings.getExporterProperty(PASSWORD), 345903),
        settings.getExporterProperty(STORE_PASSWORD, false));

    if (login.askLogin() != JOptionPane.OK_OPTION) {
      return false;
    }

    if ((StringUtils.isBlank(login.getUsername()) || (StringUtils.isBlank(login.getPassword())))) {
      JOptionPane.showMessageDialog(parent, mLocalizer.msg("noUserOrPassword",
          "No Username or Password entered!"), Localizer
          .getLocalization(Localizer.I18N_ERROR), JOptionPane.ERROR_MESSAGE);
      return false;
    }

    settings.setExporterProperty(USERNAME, login.getUsername().trim());

    if (login.storePasswords()) {
      settings.setExporterProperty(PASSWORD, IOUtilities.xorEncode(login.getPassword().trim(), 345903));
      settings.setExporterProperty(STORE_PASSWORD, true);
    } else {
      settings.setExporterProperty(PASSWORD, "");
      settings.setExporterProperty(STORE_PASSWORD, false);
    }

    mPassword = login.getPassword().trim();
    return true;
  }

  @Override
  public boolean hasSettingsDialog() {
    return true;
  }

  @Override
  public void showSettingsDialog(CalendarExportSettings settings) {
    if (showLoginDialog(settings)) {
      try {
        showCalendarSettings(settings);
      } catch (AuthenticationException e) {
        ErrorHandler.handle(mLocalizer.msg("loginFailure", "Problems while Login to Service.\nMaybee bad Username/Password ?"), e);
        settings.setExporterProperty(STORE_PASSWORD, false);
      } catch (Exception e) {
        ErrorHandler.handle(mLocalizer.msg("commError", "Error while communicating with Google!"), e);
      }
    }
  }

  public String getIconName() {
    return "google.png";
  }
}
TOP

Related Classes of calendarexportplugin.exporter.GoogleExporter

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.