You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2013/06/07 11:28:17 UTC

svn commit: r1490553 - in /manifoldcf/trunk: ./ connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/ connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googled...

Author: kwright
Date: Fri Jun  7 09:28:15 2013
New Revision: 1490553

URL: http://svn.apache.org/r1490553
Log:
Fix for CONNECTORS-702.

Added:
    manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html   (with props)
Modified:
    manifoldcf/trunk/CHANGES.txt
    manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java
    manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveSession.java
    manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_en_US.properties
    manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_ja_JP.properties
    manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.html
    manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledrive.js
    manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveQuery.html
    manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewConfiguration_googledrive.html
    manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewSpecification_googledrive.html

Modified: manifoldcf/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/CHANGES.txt?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/CHANGES.txt (original)
+++ manifoldcf/trunk/CHANGES.txt Fri Jun  7 09:28:15 2013
@@ -3,6 +3,10 @@ $Id$
 
 ======================= 1.3-dev =====================
 
+CONNECTORS-702: Add forced ACLs to GoogleDrive connector.  Also
+fixed a number of UI-related issues.
+(Karl Wright)
+
 CONNECTORS-684: Add Dropbox connector end-user documentation for
 Japanese.
 (Shinichiro Abe)

Modified: manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java (original)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java Fri Jun  7 09:28:15 2013
@@ -26,10 +26,13 @@ import java.io.InputStream;
 import java.io.InterruptedIOException;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Date;
+import java.util.Set;
+import java.util.Iterator;
 import org.apache.manifoldcf.crawler.system.Logging;
 import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
 import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
@@ -62,10 +65,24 @@ public class GoogleDriveRepositoryConnec
   protected final static String ACTIVITY_READ = "read document";
   public final static String ACTIVITY_FETCH = "fetch";
   protected static final String RELATIONSHIP_CHILD = "child";
+  
+  /** Deny access token for default authority */
+  private final static String defaultAuthorityDenyToken = "DEAD_AUTHORITY";
+
+  // Nodes
   private static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";
+  private static final String JOB_QUERY_ATTRIBUTE = "query";
+  private static final String JOB_ACCESS_NODE_TYPE = "access";
+  private static final String JOB_TOKEN_ATTRIBUTE = "token";
+
+  // Configuration tabs
   private static final String GOOGLEDRIVE_SERVER_TAB_PROPERTY = "GoogleDriveRepositoryConnector.Server";
+  
+  // Specification tabs
   private static final String GOOGLEDRIVE_QUERY_TAB_PROPERTY = "GoogleDriveRepositoryConnector.GoogleDriveQuery";
-  // Template names
+  private static final String GOOGLEDRIVE_SECURITY_TAB_PROPERTY = "GoogleDriveRepositoryConnector.Security";
+  
+  // Template names for configuration
   /**
    * Forward to the javascript to check the configuration parameters
    */
@@ -74,23 +91,31 @@ public class GoogleDriveRepositoryConnec
    * Server tab template
    */
   private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_google_server.html";
+  
+  /**
+   * Forward to the HTML template to view the configuration parameters
+   */
+  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_googledrive.html";
+   
+  // Template names for specification
   /**
-   * Forward to the javascript to check the specification parameters for the
-   * job
+   * Forward to the javascript to check the specification parameters for the job
    */
   private static final String EDIT_SPEC_HEADER_FORWARD = "editSpecification_googledrive.js";
   /**
-   * Forward to the template to edit the configuration parameters for the job
+   * Forward to the template to edit the query for the job
    */
   private static final String EDIT_SPEC_FORWARD_GOOGLEDRIVEQUERY = "editSpecification_googledriveQuery.html";
   /**
-   * Forward to the HTML template to view the configuration parameters
+   * Forward to the template to edit the security parameters for the job
    */
-  private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_googledrive.html";
+  private static final String EDIT_SPEC_FORWARD_SECURITY = "editSpecification_googledriveSecurity.html";
+  
   /**
    * Forward to the template to view the specification parameters for the job
    */
   private static final String VIEW_SPEC_FORWARD = "viewSpecification_googledrive.html";
+  
   /**
    * Endpoint server name
    */
@@ -393,7 +418,7 @@ public class GoogleDriveRepositoryConnec
    * @param newMap is the map to fill in
    * @param parameters is the current set of configuration parameters
    */
-  private static void fillInServerConfigurationMap(Map<String, String> newMap, ConfigParams parameters) {
+  private static void fillInServerConfigurationMap(Map<String, Object> newMap, ConfigParams parameters) {
     String clientid = parameters.getParameter(GoogleDriveConfig.CLIENT_ID_PARAM);
     String clientsecret = parameters.getParameter(GoogleDriveConfig.CLIENT_SECRET_PARAM);
     String refreshtoken = parameters.getParameter(GoogleDriveConfig.REFRESH_TOKEN_PARAM);
@@ -401,18 +426,18 @@ public class GoogleDriveRepositoryConnec
     if (clientid == null) {
       clientid = StringUtils.EMPTY;
     }
+    
     if (clientsecret == null) {
       clientsecret = StringUtils.EMPTY;
     }
 
-
     if (refreshtoken == null) {
       refreshtoken = StringUtils.EMPTY;
     }
 
-    newMap.put(GoogleDriveConfig.CLIENT_ID_PARAM, clientid);
-    newMap.put(GoogleDriveConfig.CLIENT_SECRET_PARAM, clientsecret);
-    newMap.put(GoogleDriveConfig.REFRESH_TOKEN_PARAM, refreshtoken);
+    newMap.put("CLIENTID", clientid);
+    newMap.put("CLIENTSECRET", clientsecret);
+    newMap.put("REFRESHTOKEN", refreshtoken);
   }
 
   /**
@@ -430,25 +455,12 @@ public class GoogleDriveRepositoryConnec
   @Override
   public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
       Locale locale, ConfigParams parameters) throws ManifoldCFException, IOException {
-    Map<String, String> paramMap = new HashMap<String, String>();
+    Map<String, Object> paramMap = new HashMap<String, Object>();
 
     // Fill in map from each tab
     fillInServerConfigurationMap(paramMap, parameters);
 
-    outputResource(VIEW_CONFIG_FORWARD, out, locale, paramMap);
-  }
-
-  /**
-   * Read the content of a resource, replace the variable ${PARAMNAME} with
-   * the value and copy it to the out.
-   *
-   * @param resName
-   * @param out
-   * @throws ManifoldCFException
-   */
-  private static void outputResource(String resName, IHTTPOutput out,
-      Locale locale, Map<String, String> paramMap) throws ManifoldCFException {
-    Messages.outputResourceWithVelocity(out, locale, resName, paramMap, true);
+    Messages.outputResourceWithVelocity(out,locale,VIEW_CONFIG_FORWARD,paramMap);
   }
 
   /**
@@ -472,13 +484,13 @@ public class GoogleDriveRepositoryConnec
     // Add the Server tab
     tabsArray.add(Messages.getString(locale, GOOGLEDRIVE_SERVER_TAB_PROPERTY));
     // Map the parameters
-    Map<String, String> paramMap = new HashMap<String, String>();
+    Map<String, Object> paramMap = new HashMap<String, Object>();
 
     // Fill in the parameters from each tab
     fillInServerConfigurationMap(paramMap, parameters);
 
     // Output the Javascript - only one Velocity template for all tabs
-    outputResource(EDIT_CONFIG_HEADER_FORWARD, out, locale, paramMap);
+    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_HEADER_FORWARD,paramMap);
   }
 
   @Override
@@ -486,16 +498,16 @@ public class GoogleDriveRepositoryConnec
       IHTTPOutput out, Locale locale, ConfigParams parameters, String tabName)
       throws ManifoldCFException, IOException {
 
-    // Call the Velocity templates for each tab
 
-    // Server tab
-    Map<String, String> paramMap = new HashMap<String, String>();
+    // Call the Velocity templates for each tab
+    Map<String, Object> paramMap = new HashMap<String, Object>();
     // Set the tab name
     paramMap.put("TabName", tabName);
+
+    // Server tab
     // Fill in the parameters
     fillInServerConfigurationMap(paramMap, parameters);
-    outputResource(EDIT_CONFIG_FORWARD_SERVER, out, locale, paramMap);
-
+    Messages.outputResourceWithVelocity(out,locale,EDIT_CONFIG_FORWARD_SERVER,paramMap);
   }
 
   /**
@@ -541,17 +553,32 @@ public class GoogleDriveRepositoryConnec
   /**
    * Fill in specification Velocity parameter map for GOOGLEDRIVEQuery tab.
    */
-  private static void fillInGOOGLEDRIVEQuerySpecificationMap(Map<String, String> newMap, DocumentSpecification ds) {
-    int i = 0;
+  private static void fillInGOOGLEDRIVEQuerySpecificationMap(Map<String, Object> newMap, DocumentSpecification ds) {
     String GoogleDriveQuery = GoogleDriveConfig.GOOGLEDRIVE_QUERY_DEFAULT;
-    while (i < ds.getChildCount()) {
+    for (int i = 0; i < ds.getChildCount(); i++) {
       SpecificationNode sn = ds.getChild(i);
       if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        GoogleDriveQuery = sn.getAttributeValue(GoogleDriveConfig.GOOGLEDRIVE_QUERY_PARAM);
+        GoogleDriveQuery = sn.getAttributeValue(JOB_QUERY_ATTRIBUTE);
       }
-      i++;
     }
-    newMap.put(GoogleDriveConfig.GOOGLEDRIVE_QUERY_PARAM, GoogleDriveQuery);
+    newMap.put("GOOGLEDRIVEQUERY", GoogleDriveQuery);
+  }
+
+  /**
+   * Fill in specification Velocity parameter map for GOOGLEDRIVESecurity tab.
+   */
+  private static void fillInGOOGLEDRIVESecuritySpecificationMap(Map<String, Object> newMap, DocumentSpecification ds) {
+    List<Map<String,String>> accessTokenList = new ArrayList<Map<String,String>>();
+    for (int i = 0; i < ds.getChildCount(); i++) {
+      SpecificationNode sn = ds.getChild(i);
+      if (sn.getType().equals(JOB_ACCESS_NODE_TYPE)) {
+        String token = sn.getAttributeValue(JOB_TOKEN_ATTRIBUTE);
+        Map<String,String> accessMap = new HashMap<String,String>();
+        accessMap.put("TOKEN",token);
+        accessTokenList.add(accessMap);
+      }
+    }
+    newMap.put("ACCESSTOKENS", accessTokenList);
   }
 
   /**
@@ -568,12 +595,13 @@ public class GoogleDriveRepositoryConnec
   public void viewSpecification(IHTTPOutput out, Locale locale, DocumentSpecification ds)
       throws ManifoldCFException, IOException {
 
-    Map<String, String> paramMap = new HashMap<String, String>();
+    Map<String, Object> paramMap = new HashMap<String, Object>();
 
     // Fill in the map with data from all tabs
     fillInGOOGLEDRIVEQuerySpecificationMap(paramMap, ds);
+    fillInGOOGLEDRIVESecuritySpecificationMap(paramMap, ds);
 
-    outputResource(VIEW_SPEC_FORWARD, out, locale, paramMap);
+    Messages.outputResourceWithVelocity(out,locale,VIEW_SPEC_FORWARD,paramMap);
   }
 
   /**
@@ -593,8 +621,9 @@ public class GoogleDriveRepositoryConnec
   @Override
   public String processSpecificationPost(IPostParameters variableContext,
       DocumentSpecification ds) throws ManifoldCFException {
-    String cmisQuery = variableContext.getParameter(GoogleDriveConfig.GOOGLEDRIVE_QUERY_PARAM);
-    if (cmisQuery != null) {
+
+    String googleDriveQuery = variableContext.getParameter("googledrivequery");
+    if (googleDriveQuery != null) {
       int i = 0;
       while (i < ds.getChildCount()) {
         SpecificationNode oldNode = ds.getChild(i);
@@ -605,10 +634,51 @@ public class GoogleDriveRepositoryConnec
         i++;
       }
       SpecificationNode node = new SpecificationNode(JOB_STARTPOINT_NODE_TYPE);
-      node.setAttribute(GoogleDriveConfig.GOOGLEDRIVE_QUERY_PARAM, cmisQuery);
-      variableContext.setParameter(GoogleDriveConfig.GOOGLEDRIVE_QUERY_PARAM, cmisQuery);
+      node.setAttribute(JOB_QUERY_ATTRIBUTE, googleDriveQuery);
       ds.addChild(ds.getChildCount(), node);
     }
+    
+    String xc = variableContext.getParameter("tokencount");
+    if (xc != null) {
+      // Delete all tokens first
+      int i = 0;
+      while (i < ds.getChildCount()) {
+        SpecificationNode sn = ds.getChild(i);
+        if (sn.getType().equals(JOB_ACCESS_NODE_TYPE))
+          ds.removeChild(i);
+        else
+          i++;
+      }
+
+      int accessCount = Integer.parseInt(xc);
+      i = 0;
+      while (i < accessCount) {
+        String accessDescription = "_"+Integer.toString(i);
+        String accessOpName = "accessop"+accessDescription;
+        xc = variableContext.getParameter(accessOpName);
+        if (xc != null && xc.equals("Delete")) {
+          // Next row
+          i++;
+          continue;
+        }
+        // Get the stuff we need
+        String accessSpec = variableContext.getParameter("spectoken"+accessDescription);
+        SpecificationNode node = new SpecificationNode(JOB_ACCESS_NODE_TYPE);
+        node.setAttribute(JOB_TOKEN_ATTRIBUTE,accessSpec);
+        ds.addChild(ds.getChildCount(),node);
+        i++;
+      }
+
+      String op = variableContext.getParameter("accessop");
+      if (op != null && op.equals("Add"))
+      {
+        String accessspec = variableContext.getParameter("spectoken");
+        SpecificationNode node = new SpecificationNode(JOB_ACCESS_NODE_TYPE);
+        node.setAttribute(JOB_TOKEN_ATTRIBUTE,accessspec);
+        ds.addChild(ds.getChildCount(),node);
+      }
+    }
+
     return null;
   }
 
@@ -630,10 +700,12 @@ public class GoogleDriveRepositoryConnec
       IOException {
 
     // Output GOOGLEDRIVEQuery tab
-    Map<String, String> paramMap = new HashMap<String, String>();
+    Map<String, Object> paramMap = new HashMap<String, Object>();
     paramMap.put("TabName", tabName);
     fillInGOOGLEDRIVEQuerySpecificationMap(paramMap, ds);
-    outputResource(EDIT_SPEC_FORWARD_GOOGLEDRIVEQUERY, out, locale, paramMap);
+    fillInGOOGLEDRIVESecuritySpecificationMap(paramMap, ds);
+    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_FORWARD_GOOGLEDRIVEQUERY,paramMap);
+    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_FORWARD_SECURITY,paramMap);
   }
 
   /**
@@ -652,14 +724,17 @@ public class GoogleDriveRepositoryConnec
   public void outputSpecificationHeader(IHTTPOutput out,
       Locale locale, DocumentSpecification ds, List<String> tabsArray)
       throws ManifoldCFException, IOException {
+
     tabsArray.add(Messages.getString(locale, GOOGLEDRIVE_QUERY_TAB_PROPERTY));
+    tabsArray.add(Messages.getString(locale, GOOGLEDRIVE_SECURITY_TAB_PROPERTY));
 
-    Map<String, String> paramMap = new HashMap<String, String>();
+    Map<String, Object> paramMap = new HashMap<String, Object>();
 
     // Fill in the specification header map, using data from all tabs.
     fillInGOOGLEDRIVEQuerySpecificationMap(paramMap, ds);
+    fillInGOOGLEDRIVESecuritySpecificationMap(paramMap, ds);
 
-    outputResource(EDIT_SPEC_HEADER_FORWARD, out, locale, paramMap);
+    Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_HEADER_FORWARD,paramMap);
   }
 
   /**
@@ -710,7 +785,7 @@ public class GoogleDriveRepositoryConnec
     while (i < spec.getChildCount()) {
       SpecificationNode sn = spec.getChild(i);
       if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
-        googleDriveQuery = sn.getAttributeValue(GoogleDriveConfig.GOOGLEDRIVE_QUERY_PARAM);
+        googleDriveQuery = sn.getAttributeValue(JOB_QUERY_ATTRIBUTE);
         break;
       }
       i++;
@@ -895,8 +970,9 @@ public class GoogleDriveRepositoryConnec
       boolean[] scanOnly) throws ManifoldCFException, ServiceInterruption {
 
     Logging.connectors.debug("GOOGLEDRIVE: Inside processDocuments");
-        
+
     for (int i = 0; i < documentIdentifiers.length; i++) {
+      // MHL for access tokens
       long startTime = System.currentTimeMillis();
       String errorCode = "FAILED";
       String errorDesc = StringUtils.EMPTY;
@@ -912,8 +988,7 @@ public class GoogleDriveRepositoryConnec
         }
 
         File googleFile = getObject(nodeId);
-
-        if (googleFile.containsKey("explicitlyTrashed") && googleFile.getExplicitlyTrashed()) {
+        if (googleFile == null || (googleFile.containsKey("explicitlyTrashed") && googleFile.getExplicitlyTrashed())) {
           //its deleted, move on
           continue;
         }
@@ -990,9 +1065,29 @@ public class GoogleDriveRepositoryConnec
             // Get the file length
             long fileLength = googleFile.getFileSize();
 
+            // Unpack the version string
+            ArrayList acls = new ArrayList();
+            StringBuilder denyAclBuffer = new StringBuilder();
+            int index = unpackList(acls,version,0,'+');
+            if (index < version.length() && version.charAt(index++) == '+') {
+              index = unpack(denyAclBuffer,version,index,'+');
+            }
+
             //otherwise process
             RepositoryDocument rd = new RepositoryDocument();
 
+            // Turn into acls and add into description
+            String[] aclArray = new String[acls.size()];
+            for (int j = 0; j < aclArray.length; j++) {
+              aclArray[j] = (String)acls.get(j);
+            }
+            rd.setACL(aclArray);
+            if (denyAclBuffer.length() > 0) {
+              String[] denyAclArray = new String[]{denyAclBuffer.toString()};
+              rd.setDenyACL(denyAclArray);
+            }
+
+            // Now do standard stuff
             String mimeType = googleFile.getMimeType();
             DateTime createdDate = googleFile.getCreatedDate();
             DateTime modifiedDate = googleFile.getModifiedDate();
@@ -1012,6 +1107,7 @@ public class GoogleDriveRepositoryConnec
               rd.setFileName(title + "." + extension);
             }
 
+            // Get general document metadata
             for (Entry<String, Object> entry : googleFile.entrySet()) {
               rd.addField(entry.getKey(), entry.getValue().toString());
             }
@@ -1199,17 +1295,35 @@ public class GoogleDriveRepositoryConnec
   public String[] getDocumentVersions(String[] documentIdentifiers,
       DocumentSpecification spec) throws ManifoldCFException,
       ServiceInterruption {
-    getSession();
+
+    // Forced acls
+    String[] acls = getAcls(spec);
+    // Sort it,
+    java.util.Arrays.sort(acls);
+
     String[] rval = new String[documentIdentifiers.length];
     for (int i = 0; i < rval.length; i++) {
       File googleFile = getObject(documentIdentifiers[i]);
       if (!isDir(googleFile)) {
         String rev = googleFile.getModifiedDate().toStringRfc3339();
         if (StringUtils.isNotEmpty(rev)) {
-          rval[i] = rev;
+          StringBuilder sb = new StringBuilder();
+
+          // Acls
+          packList(sb,acls,'+');
+          if (acls.length > 0) {
+            sb.append('+');
+            pack(sb,defaultAuthorityDenyToken,'+');
+          }
+          else
+            sb.append('-');
+
+          sb.append(rev);
+          rval[i] = sb.toString();
         } else {
-          //a google document that doesn't contain versioning information will always be processed
-          rval[i] = StringUtils.EMPTY;
+          //a google document that doesn't contain versioning information will NEVER be processed.
+          // I don't know what this means, and whether it can ever occur.
+          rval[i] = null;
         }
       } else {
         //a google folder will always be processed
@@ -1219,6 +1333,29 @@ public class GoogleDriveRepositoryConnec
     return rval;
   }
 
+  /** Grab forced acl out of document specification.
+  *@param spec is the document specification.
+  *@return the acls.
+  */
+  protected static String[] getAcls(DocumentSpecification spec) {
+    Set<String> map = new HashSet<String>();
+    for (int i = 0; i < spec.getChildCount(); i++) {
+      SpecificationNode sn = spec.getChild(i);
+      if (sn.getType().equals(JOB_ACCESS_NODE_TYPE)) {
+        String token = sn.getAttributeValue(JOB_TOKEN_ATTRIBUTE);
+        map.add(token);
+      }
+    }
+
+    String[] rval = new String[map.size()];
+    Iterator<String> iter = map.iterator();
+    int i = 0;
+    while (iter.hasNext()) {
+      rval[i++] = (String)iter.next();
+    }
+    return rval;
+  }
+
   private boolean isDir(File f) {
     return f.getMimeType().compareToIgnoreCase("application/vnd.google-apps.folder") == 0;
   }

Modified: manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveSession.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveSession.java?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveSession.java (original)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveSession.java Fri Jun  7 09:28:15 2013
@@ -84,6 +84,8 @@ public class GoogleDriveSession {
     Map<String, String> info = new HashMap<String, String>();
     info.put("Application Name", drive.getApplicationName());
     info.put("Base URL", drive.getBaseUrl());
+    // We need something that will actually cause a back-and-forth to the server!
+    drive.files().get("").execute();
     return info;
   }
 

Modified: manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_en_US.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_en_US.properties?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_en_US.properties (original)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_en_US.properties Fri Jun  7 09:28:15 2013
@@ -14,22 +14,25 @@
 # limitations under the License.
 
 GoogleDriveRepositoryConnector.Server=Server
-GoogleDriveRepositoryConnector.GoogleDriveQuery=Google Drive Seed Query
+GoogleDriveRepositoryConnector.GoogleDriveQuery=Seed Query
 GoogleDriveRepositoryConnector.Security=Security
 
-GoogleDriveRepositoryConnector.RefreshToken=RefreshToken:
-GoogleDriveRepositoryConnector.ClientID=Client ID:
-GoogleDriveRepositoryConnector.ClientSecret=Client Secret ID:
+GoogleDriveRepositoryConnector.RefreshTokenColon=RefreshToken:
+GoogleDriveRepositoryConnector.ClientIDColon=Client ID:
+GoogleDriveRepositoryConnector.ClientSecretColon=Client Secret ID:
 
 
 GoogleDriveRepositoryConnector.RefreshTokenMustNotBeNull=Refresh Token must not be null
 GoogleDriveRepositoryConnector.ClientSecretMustNotBeNull=Client Secret must not be null
 GoogleDriveRepositoryConnector.ClientMustNotBeNull=Client must not be null
 
+GoogleDriveRepositoryConnector.SeedQueryCannotBeNull=Seed query cannot be null
+GoogleDriveRepositoryConnector.GoogleDriveQueryColon=Google Drive seed query:
 
-GoogleDriveRepositoryConnector.GoogleDriveQueryColon=Google Drive Seed Query:
-
-GoogleDriveRepositoryConnector.ParametersColon=Parameters:
-GoogleDriveRepositoryConnector.UsernameEquals=username=
-GoogleDriveRepositoryConnector.PasswordEquals=password=
-
+GoogleDriveRepositoryConnector.NoAccessTokensPresent=No access tokens present
+GoogleDriveRepositoryConnector.Add=Add
+GoogleDriveRepositoryConnector.AddAccessToken=Add access token
+GoogleDriveRepositoryConnector.Delete=Delete
+GoogleDriveRepositoryConnector.DeleteToken=Delete token #
+GoogleDriveRepositoryConnector.AccessTokensColon=Access tokens:
+GoogleDriveRepositoryConnector.TypeInAnAccessToken=Type in an access token

Modified: manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_ja_JP.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_ja_JP.properties?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_ja_JP.properties (original)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/googledrive/common_ja_JP.properties Fri Jun  7 09:28:15 2013
@@ -14,22 +14,25 @@
 # limitations under the License.
 
 GoogleDriveRepositoryConnector.Server=Server
+GoogleDriveRepositoryConnector.GoogleDriveQuery=Seed Query
+GoogleDriveRepositoryConnector.Security=Security
 
-
-GoogleDriveRepositoryConnector.RefreshToken=RefreshToken:
-GoogleDriveRepositoryConnector.ClientID=Client ID:
-GoogleDriveRepositoryConnector.ClientSecret=Client Secret ID:
+GoogleDriveRepositoryConnector.RefreshTokenColon=RefreshToken:
+GoogleDriveRepositoryConnector.ClientIDColon=Client ID:
+GoogleDriveRepositoryConnector.ClientSecretColon=Client Secret ID:
 
 
 GoogleDriveRepositoryConnector.RefreshTokenMustNotBeNull=Refresh Token must not be null
 GoogleDriveRepositoryConnector.ClientSecretMustNotBeNull=Client Secret must not be null
 GoogleDriveRepositoryConnector.ClientMustNotBeNull=Client must not be null
 
+GoogleDriveRepositoryConnector.SeedQueryCannotBeNull=Seed query cannot be null
+GoogleDriveRepositoryConnector.GoogleDriveQueryColon=Google Drive seed query:
 
-GoogleDriveRepositoryConnector.GoogleDriveQuery=Google Drive Seed Query
-GoogleDriveRepositoryConnector.GoogleDriveQueryColon=Google Drive Seed Query:
-
-GoogleDriveRepositoryConnector.ParametersColon=Parameters:
-GoogleDriveRepositoryConnector.UsernameEquals=username=
-GoogleDriveRepositoryConnector.PasswordEquals=password=
-
+GoogleDriveRepositoryConnector.NoAccessTokensPresent=No access tokens present
+GoogleDriveRepositoryConnector.Add=Add
+GoogleDriveRepositoryConnector.AddAccessToken=Add access token
+GoogleDriveRepositoryConnector.Delete=Delete
+GoogleDriveRepositoryConnector.DeleteToken=Delete token #
+GoogleDriveRepositoryConnector.AccessTokensColon=Access tokens:
+GoogleDriveRepositoryConnector.TypeInAnAccessToken=Type in an access token

Modified: manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.html
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.html?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.html (original)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editConfiguration_google_server.html Fri Jun  7 09:28:15 2013
@@ -15,7 +15,7 @@
  limitations under the License.
 -->
 
-#if($TABNAME == $ResourceBundle.getString('GoogleDriveRepositoryConnector.Server'))
+#if($TabName == $ResourceBundle.getString('GoogleDriveRepositoryConnector.Server'))
 
 <table class="displaytable">
   <tr>

Modified: manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledrive.js
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledrive.js?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledrive.js (original)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledrive.js Fri Jun  7 09:28:15 2013
@@ -17,9 +17,14 @@
 
 <script type="text/javascript">
 <!--
-function checkSpecification()
+function checkSpecificationForSave()
 {
-  // Does nothing right now.
+  if (editjob.googledrivequery.value == "") {
+    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.SeedQueryCannotBeNull'))");
+    SelectTab("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.GoogleDriveQuery'))");
+    editjob.googledrivequery.focus();
+    return false;
+  }
   return true;
 }
  
@@ -28,5 +33,22 @@ function SpecOp(n, opValue, anchorvalue)
   eval("editjob."+n+".value = \""+opValue+"\"");
   postFormSetAnchor(anchorvalue);
 }
+
+function SpecDeleteToken(i)
+{
+  SpecOp("accessop_"+i,"Delete","token_"+i);
+}
+
+function SpecAddToken(i)
+{
+  if (editjob.spectoken.value == "")
+  {
+    alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.TypeInAnAccessToken'))");
+    editjob.spectoken.focus();
+    return;
+  }
+  SpecOp("accessop","Add","token_"+i);
+}
+
 //-->
 </script>
\ No newline at end of file

Modified: manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveQuery.html
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveQuery.html?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveQuery.html (original)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveQuery.html Fri Jun  7 09:28:15 2013
@@ -15,7 +15,7 @@
  limitations under the License.
 -->
 
-#if($TABNAME == $ResourceBundle.getString('GoogleDriveRepositoryConnector.GoogleDriveQuery'))
+#if($TabName == $ResourceBundle.getString('GoogleDriveRepositoryConnector.GoogleDriveQuery'))
 
 <table class="displaytable">
   <tr><td class="separator" colspan="2"><hr/></td></tr>
@@ -27,7 +27,7 @@
     </td>
     <td class="value">
       <nobr>
-        <input type="text" size="120" name="googledriveQuery" value="$Encoder.attributeEscape($GOOGLEDRIVEQUERY)" />
+        <input type="text" size="120" name="googledrivequery" value="$Encoder.attributeEscape($GOOGLEDRIVEQUERY)" />
       </nobr>
     </td>
   </tr>
@@ -35,6 +35,6 @@
 
 #else
 
-<input type="hidden" name="googledriveQuery" value="$Encoder.attributeEscape($GOOGLEDRIVEQUERY)" />
+<input type="hidden" name="googledrivequery" value="$Encoder.attributeEscape($GOOGLEDRIVEQUERY)" />
 
 #end

Added: manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html?rev=1490553&view=auto
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html (added)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html Fri Jun  7 09:28:15 2013
@@ -0,0 +1,73 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+#if($TabName == $ResourceBundle.getString('GoogleDriveRepositoryConnector.Security'))
+
+<table class="displaytable">
+  <tr><td class="separator" colspan="2"><hr/></td></tr>
+  
+  #set($atcounter = 0)
+  #foreach($atoken in $ACCESSTOKENS)
+
+  <tr>
+    <td class="description">
+      <input type="hidden" name="accessop_$atcounter" value=""/>
+      <input type="hidden" name="spectoken_$atcounter" value="$Encoder.attributeEscape($atoken.get('TOKEN'))"/>
+      <a name="token_$atcounter">
+        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.Delete'))" onClick='Javascript:SpecDeleteToken($atcounter)' alt="$Encoder.attributeEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.DeleteToken'))$atcounter"/>
+      </a>
+    </td>
+    <td class="value">$Encoder.bodyEscape($atoken.get('TOKEN'))</td>
+  </tr>
+
+    #set($atcounter = $atcounter + 1)
+  #end
+
+  #set($nexttoken = $atcounter + 1)
+
+  #if($atcounter == 0)
+  <tr>
+    <td class="message" colspan="2">$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.NoAccessTokensPresent'))</td>
+  </tr>
+  #end
+
+  <tr><td class="lightseparator" colspan="2"><hr/></td></tr>
+  
+  <tr>
+    <td class="description">
+      <input type="hidden" name="tokencount" value="$atcounter"/>
+      <input type="hidden" name="accessop" value=""/>
+      <a name="token_$atcounter">
+        <input type="button" value="$Encoder.attributeEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.Add'))" onClick='Javascript:SpecAddToken($nexttoken)' alt="$Encoder.attributeEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.AddAccessToken'))"/>
+      </a>
+    </td>
+    <td class="value">
+      <input type="text" size="30" name="spectoken" value=""/>
+    </td>
+  </tr>
+</table>
+
+#else
+
+  #set($atcounter = 0)
+  #foreach($atoken in $ACCESSTOKENS)
+<input type="hidden" name="spectoken_$atcounter" value="$Encoder.attributeEscape($atoken.get('TOKEN'))"/>
+    #set($atcounter = $atcounter + 1)
+  #end
+<input type="hidden" name="tokencount" value="$atcounter"/>
+
+#end

Propchange: manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/editSpecification_googledriveSecurity.html
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewConfiguration_googledrive.html
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewConfiguration_googledrive.html?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewConfiguration_googledrive.html (original)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewConfiguration_googledrive.html Fri Jun  7 09:28:15 2013
@@ -17,23 +17,27 @@
 
 <table class="displaytable">
   <tr>
-    <td class="description" colspan="1">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ParametersColon'))
-      </nobr>
-    </td>
-    <td class="value" colspan="3">
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.CliendID'))$Encoder.bodyEscape($CLIENTID)
-      </nobr>
-      <br />
-      <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ClientSecret'))$Encoder.bodyEscape($CLIENTSECRET)
-      </nobr>
-      <br />
-       <nobr>
-        $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.RefreshToken'))$Encoder.bodyEscape($REFRESHTOKEN)
-      </nobr>
+    <td class="description">
+      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ClientIDColon'))</nobr>
+    </td>
+    <td class="value">
+      <nobr>$Encoder.bodyEscape($CLIENTID)</nobr>
+    </td>
+  </tr>
+  <tr>
+    <td class="description">
+      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.ClientSecretColon'))</nobr>
+    </td>
+    <td class="value">
+      <nobr>$Encoder.bodyEscape($CLIENTSECRET)</nobr>
+    </td>
+  </tr>
+  <tr>
+    <td class="description">
+      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.RefreshTokenColon'))</nobr>
+    </td>
+    <td class="value">
+      <nobr>$Encoder.bodyEscape($REFRESHTOKEN)</nobr>
     </td>
   </tr>
 </table>

Modified: manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewSpecification_googledrive.html
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewSpecification_googledrive.html?rev=1490553&r1=1490552&r2=1490553&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewSpecification_googledrive.html (original)
+++ manifoldcf/trunk/connectors/googledrive/connector/src/main/resources/org/apache/manifoldcf/crawler/connectors/googledrive/viewSpecification_googledrive.html Fri Jun  7 09:28:15 2013
@@ -18,10 +18,30 @@
 <table class="displaytable">
   <tr>
     <td class="description">
-      $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.GoogleDriveQueryColon'))
+      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.GoogleDriveQueryColon'))</nobr>
     </td>
     <td class="value">
-      $Encoder.bodyEscape($GOOGLEDRIVEQUERY)
+      <nobr>$Encoder.bodyEscape($GOOGLEDRIVEQUERY)</nobr>
     </td>
   </tr>
+  <tr><td class="separator" colspan="2"><hr/></td></tr>
+  <tr>
+#if($ACCESSTOKENS.size() == 0)
+    <td class="message" colspan="2">
+      $Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.NoAccessTokensPresent'))
+    </td>
+#else
+    <td class="description">
+      <nobr>$Encoder.bodyEscape($ResourceBundle.getString('GoogleDriveRepositoryConnector.AccessTokensColon'))</nobr>
+    </td>
+    <td class="value">
+  #set($atcounter = 0)
+  #foreach($atoken in $ACCESSTOKENS)
+    <nobr>$Encoder.bodyEscape($atoken.get('TOKEN'))</nobr><br/>
+    #set($atcounter = $atcounter + 1)
+  #end
+    </td>
+#end
+  </tr>
+
 </table>