Exemplo n.º 1
0
  private void putShelvesData(
      Context context,
      AuthManager trixAuth,
      String spreadsheetId,
      String worksheetId,
      DocsTagBuilder tagBuilder)
      throws IOException {

    String worksheetUri =
        String.format(DocsHelper.DOCS_SPREADSHEET_URL_FORMAT, spreadsheetId, worksheetId);

    String postText =
        new StringBuilder()
            .append(
                "<entry xmlns='http://www.w3.org/2005/Atom' "
                    + "xmlns:gsx='http://schemas.google.com/spreadsheets/"
                    + "2006/extended'>")
            .append(tagBuilder.build())
            .append("</entry>")
            .toString();

    // Log.i(LOG_TAG, "Inserting at: " + spreadsheetId + " => " +
    // worksheetUri);

    // Log.i(LOG_TAG, postText);

    writeRowData(trixAuth, worksheetUri, postText);

    // Log.i(LOG_TAG, "Post finished.");
  }
Exemplo n.º 2
0
  /**
   * Uploads the collection to Google Docs using the docs GData feed.
   *
   * @param c the collection
   */
  private boolean uploadToDocs() {
    GDataWrapper<GDataServiceClient> docListWrapper = new GDataWrapper<GDataServiceClient>();
    docListWrapper.setAuthManager(docListAuth);
    docListWrapper.setRetryOnAuthFailure(true);

    GDataWrapper<GDataServiceClient> trixWrapper = new GDataWrapper<GDataServiceClient>();
    trixWrapper.setAuthManager(trixAuth);
    trixWrapper.setRetryOnAuthFailure(true);

    DocsHelper docsHelper = new DocsHelper();

    GDataClient androidClient = null;
    try {
      androidClient = GDataClientFactory.getGDataClient(activity);
      SpreadsheetsClient gdataClient =
          new SpreadsheetsClient(
              androidClient, new XmlDocsGDataParserFactory(new AndroidXmlParserFactory()));
      trixWrapper.setClient(gdataClient);
      Log.d(LOG_TAG, "GData connection prepared: " + this.docListAuth);

      final int progressLeft = (50 / collectionsToSend.length) / 3;

      for (String name : collectionsToSend) {
        Log.d(LOG_TAG, "Sending to Google Docs: " + name);

        DocumentsClient docsGdataClient =
            new DocumentsClient(
                androidClient, new XmlDocsGDataParserFactory(new AndroidXmlParserFactory()));
        docListWrapper.setClient(docsGdataClient);

        final String sheetTitle = name + " (Shelves) ";

        String spreadsheetId = null;
        // First try to find the spreadsheet:
        /*
         * try { spreadsheetId = docsHelper.requestSpreadsheetId(
         * docListWrapper, sheetTitle); } catch (IOException e) {
         * Log.i(LOG_TAG, "Spreadsheet lookup failed.", e); return
         * false; }
         *
         * if (spreadsheetId == null) {
         * SettingsActivity.getInstance().getAndSetProgressValue(
         * progressLeft); // Waiting a few seconds and trying again.
         * Maybe the server // just // had a // hiccup (unfortunately
         * that happens quite a lot...). try { Thread.sleep(5000); }
         * catch (InterruptedException e) { Log.e(LOG_TAG,
         * "Sleep interrupted", e); }
         *
         * try { spreadsheetId = docsHelper.requestSpreadsheetId(
         * docListWrapper, sheetTitle); } catch (IOException e) {
         * Log.i(LOG_TAG, "2nd spreadsheet lookup failed.", e); return
         * false; } }
         */

        // We were unable to find an existing spreadsheet, so create a
        // new one.
        if (spreadsheetId == null) {
          Log.i(LOG_TAG, "Creating new spreadsheet: " + sheetTitle);

          try {
            spreadsheetId =
                docsHelper.createSpreadsheet(
                    activity, docListWrapper, name.toLowerCase(), sheetTitle);
          } catch (IOException e) {
            Log.i(LOG_TAG, "Failed to create new spreadsheet " + sheetTitle, e);
            return false;
          }

          createdNewSpreadSheet = true;

          if (spreadsheetId == null) {
            SettingsActivity.getInstance().getAndSetProgressValue(progressLeft);
            // The previous creation might have succeeded even
            // though GData reported an error. Seems to be a know
            // bug,
            // see
            // http://code.google.com/p/gdata-issues/issues/detail?id=929
            Log.w(LOG_TAG, "Create might have failed. Trying to find created document.");
            try {
              Thread.sleep(5000);
            } catch (InterruptedException e) {
              Log.e(LOG_TAG, "Sleep interrupted", e);
            }

            try {
              spreadsheetId = docsHelper.requestSpreadsheetId(docListWrapper, sheetTitle);
            } catch (IOException e) {
              Log.i(LOG_TAG, "Failed create-failed lookup", e);
              return false;
            }

            if (spreadsheetId == null) {
              try {
                Thread.sleep(5000);
              } catch (InterruptedException e) {
                Log.e(LOG_TAG, "Sleep interrupted", e);
              }

              try {
                Log.w(LOG_TAG, "Checking id one more time");
                spreadsheetId = docsHelper.requestSpreadsheetId(docListWrapper, sheetTitle);
              } catch (IOException e) {
                Log.i(LOG_TAG, "Failed create-failed relookup", e);
                return false;
              }
            }
            if (spreadsheetId == null) {
              Log.w(LOG_TAG, "Creating new spreadsheet really failed.");
              return false;
            }
          }
        }

        String worksheetId = null;
        try {
          worksheetId = docsHelper.getWorksheetId(trixWrapper, spreadsheetId);
          if (worksheetId == null) {
            throw new IOException("Worksheet ID lookup returned empty");
          }
        } catch (IOException e) {
          Log.i(LOG_TAG, "Looking up worksheet id failed.", e);
          return false;
        }
        SettingsActivity.getInstance().getAndSetProgressValue(progressLeft);

        final String fileName = ExportUtilities.determineShelvesFileName(name);

        Uri uri = ShelvesApplication.TYPES_TO_URI.get(name.toLowerCase());

        if (uri == null) uri = ShelvesApplication.TYPES_TO_URI.get(name);

        ExportUtilities.exportingToShelves(IOUtilities.getExternalFile(fileName), cr, uri);

        final String[] data =
            TextUtilities.readFileAsString(IOUtilities.getExternalFile(fileName).toString())
                .replaceAll("\"", "")
                .split("\n");

        Log.i(LOG_TAG, "Updating spreadsheet for " + name);

        final int dataLength = data.length;
        int updatePercentage = dataLength / progressLeft;

        if (data != null) {
          final String[] headers = data[0].split("\\t+");

          for (int i = 1; i < dataLength; i++) {
            final String[] row = data[i].split("\\t+");
            DocsTagBuilder dtb = new DocsTagBuilder();

            /*
             * if (!createdNewSpreadSheet) { if
             * (querySpreadsheet(spreadsheetId, worksheetId,
             * trixAuth, row[0])) continue; }
             */

            for (int j = 0; j < row.length; j++) {
              dtb.append(headers[j], row[j]);
            }

            putShelvesData(activity, trixAuth, spreadsheetId, worksheetId, dtb);

            if (updatePercentage <= 0) updatePercentage = 5;
            if (i % updatePercentage == 0) SettingsActivity.getInstance().getAndSetProgressValue(1);

            // GJT: Can't send more than 20 inserts/second...
            // just chill out no matter what
            if (dataLength % 20 == 0) {
              try {
                Thread.sleep(1500);
              } catch (InterruptedException e) {
                Log.e(LOG_TAG, "Sleep interrupted", e);
              }
            }
          }
        }

        Log.i(LOG_TAG, "Done uploading to docs.");
      }
    } catch (IOException e) {
      Log.e(LOG_TAG, "Unable to upload docs.", e);
      return false;
    } finally {
      if (androidClient != null) {
        androidClient.close();
      }
    }
    return true;
  }