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 2011/02/16 13:07:14 UTC

svn commit: r1071216 - in /incubator/lcf/trunk: ./ connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/ connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/ connectors/fil...

Author: kwright
Date: Wed Feb 16 12:07:14 2011
New Revision: 1071216

URL: http://svn.apache.org/viewvc?rev=1071216&view=rev
Log:
Fix for CONNECTORS-151.  Add folder support to the FileNet connector.

Modified:
    incubator/lcf/trunk/   (props changed)
    incubator/lcf/trunk/CHANGES.txt
    incubator/lcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java
    incubator/lcf/trunk/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetImpl.java
    incubator/lcf/trunk/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenet.java

Propchange: incubator/lcf/trunk/
------------------------------------------------------------------------------
    svn:mergeinfo = /incubator/lcf/branches/CONNECTORS-151-branch:1063444-1071206

Modified: incubator/lcf/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/CHANGES.txt?rev=1071216&r1=1071215&r2=1071216&view=diff
==============================================================================
--- incubator/lcf/trunk/CHANGES.txt (original)
+++ incubator/lcf/trunk/CHANGES.txt Wed Feb 16 12:07:14 2011
@@ -3,6 +3,9 @@ $Id$
 
 ==================  0.2-dev ==================
 
+CONNECTORS-151; Add folder support to FileNet connector.
+(Oleg Tikhonov, Karl Wright)
+
 CONNECTORS-157: Web crawler url resolution was broken for relative
 paths, because the way java.net.URI resolved them changed.
 (Karl Wright)

Modified: incubator/lcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java?rev=1071216&r1=1071215&r2=1071216&view=diff
==============================================================================
--- incubator/lcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java (original)
+++ incubator/lcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java Wed Feb 16 12:07:14 2011
@@ -51,6 +51,7 @@ public class FilenetConnector extends or
   public static final String CONFIG_PARAM_URLLOCATION = "Document URL location";
 
   // Specification nodes
+  public static final String SPEC_NODE_FOLDER = "folder";
   public static final String SPEC_NODE_MIMETYPE = "mimetype";
   public static final String SPEC_NODE_DOCUMENTCLASS = "documentclass";
   // This specification node is only ever a child of SPEC_NODE_DOCUMENTCLASS
@@ -629,6 +630,40 @@ public class FilenetConnector extends or
     return true;
   }
   
+  /** Get child folder names, given a starting folder name.
+  *@param folderName is the starting folder name.
+  *@return the child folder names.
+  */
+  public String[] getChildFolders(String folderName)
+    throws ManifoldCFException, ServiceInterruption
+  {
+    try
+    {
+      if (folderName.startsWith("/"))
+        folderName = folderName.substring(1);
+      
+      String[] folderPath;
+      if (folderName.length() == 0)
+        folderPath = new String[0];
+      else
+        folderPath = folderName.split("/");
+      
+      String[] rval = doGetChildFolders(folderPath);
+      if (rval == null)
+        return null;
+      java.util.Arrays.sort(rval);
+      return rval;
+    }
+    catch (FilenetException e)
+    {
+      // Base our treatment on the kind of error it is.
+      if (e.getType() == FilenetException.TYPE_SERVICEINTERRUPTION)
+        throw new ServiceInterruption(e.getMessage(),0L);
+      else
+        throw new ManifoldCFException(e.getMessage(),e);
+    }
+  }
+  
   /** Queue "seed" documents.  Seed documents are the starting places for crawling activity.  Documents
   * are seeded when this method calls appropriate methods in the passed in ISeedingActivity object.
   *@param activities is the interface this method should use to perform whatever framework actions are desired.
@@ -650,9 +685,9 @@ public class FilenetConnector extends or
     while (i < spec.getChildCount())
     {
       SpecificationNode n = spec.getChild(i);
-      if (n.getType().equals("mimetype"))
+      if (n.getType().equals(SPEC_NODE_MIMETYPE))
       {
-        String mimeType = n.getAttributeValue("value");
+        String mimeType = n.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
         if (mimeType != null)
         {
           if (mimeTypesClause.length() != 0)
@@ -693,11 +728,34 @@ public class FilenetConnector extends or
       sqlBuffer.append(" AND [DateLastModified] >= ").append(buildTime(c,startTime));
     }
 
-
     sqlBuffer.append(" AND  [DateLastModified] <= ").append(buildTime(c,endTime));
 
-
-
+    // Folders are also based just on objectstore, so we add those here.
+    boolean seenAny = false;
+    i = 0;
+    while (i < spec.getChildCount())
+    {
+      SpecificationNode n = spec.getChild(i++);
+      if (n.getType().equals(SPEC_NODE_FOLDER))
+      {
+        if (!seenAny)
+        {
+          sqlBuffer.append(" AND (");
+          seenAny = true;
+        }
+        else
+        {
+          sqlBuffer.append(" or ");
+        }
+        String folderValue = n.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
+        sqlBuffer.append("This INSUBFOLDER "+quoteSQLString(folderValue));
+      }
+    }
+    if (seenAny)
+    {
+      sqlBuffer.append(")");
+    }
+    
     String whereClause = sqlBuffer.toString();
 
     i = 0;
@@ -705,9 +763,9 @@ public class FilenetConnector extends or
     {
       SpecificationNode n = spec.getChild(i);
 
-      if (n.getType().equals("documentclass"))
+      if (n.getType().equals(SPEC_NODE_DOCUMENTCLASS))
       {
-        String dc = n.getAttributeValue("value");
+        String dc = n.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
         DocClassSpec dcs = new DocClassSpec(n);
         int matchCount = dcs.getMatchCount();
         StringBuffer moreWhereClause = new StringBuffer(whereClause);
@@ -1777,6 +1835,7 @@ public class FilenetConnector extends or
   {
     tabsArray.add("Document Classes");
     tabsArray.add("Mime Types");
+    tabsArray.add("Folders");
     tabsArray.add("Security");
     out.print(
 "<script type=\"text/javascript\">\n"+
@@ -1793,6 +1852,17 @@ public class FilenetConnector extends or
 "  postFormSetAnchor(anchorvalue);\n"+
 "}\n"+
 "\n"+
+"function SpecAddToPath(anchorvalue)\n"+
+"{\n"+
+"  if (editjob.pathaddon.value == \"\")\n"+
+"  {\n"+
+"    alert(\"Select a folder first\");\n"+
+"    editjob.pathaddon.focus();\n"+
+"    return;\n"+
+"  }\n"+
+"  SpecOp(\"pathop\",\"AddToPath\",anchorvalue);\n"+
+"}\n"+
+"\n"+
 "function SpecAddMatch(docclass, anchorvalue)\n"+
 "{\n"+
 "  if (eval(\"editjob.matchfield_\"+docclass+\".value\") == \"\")\n"+
@@ -1810,7 +1880,7 @@ public class FilenetConnector extends or
 "\n"+
 "  SpecOp(\"matchop_\"+docclass,\"Add\",anchorvalue);\n"+
 "}\n"+
-"	\n"+
+"\n"+
 "function SpecAddToken(anchorvalue)\n"+
 "{\n"+
 "  if (editjob.spectoken.value == \"\")\n"+
@@ -1840,6 +1910,7 @@ public class FilenetConnector extends or
     throws ManifoldCFException, IOException
   {
     int i;
+    int k;
     Iterator iter;
 
     // "Document Classes" tab
@@ -1858,6 +1929,154 @@ public class FilenetConnector extends or
       }
     }
 
+    // Folders tab
+    if (tabName.equals("Folders"))
+    {
+      out.print(
+"<table class=\"displaytable\">\n"+
+"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
+      );
+      // Now, loop through paths.  There will be a row in the current table for each one.
+      // The row will contain a delete button on the left.  On the right will be the startpoint itself at the top,
+      // and underneath it the table where the filter criteria are edited.
+      i = 0;
+      k = 0;
+      while (i < ds.getChildCount())
+      {
+        SpecificationNode sn = ds.getChild(i++);
+        if (sn.getType().equals(SPEC_NODE_FOLDER))
+        {
+          String pathDescription = "_"+Integer.toString(k);
+          String pathOpName = "pathop"+pathDescription;
+          String startPath = sn.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
+          out.print(
+"  <tr>\n"+
+"    <td class=\"value\">\n"+
+"      <a name=\""+"path_"+Integer.toString(k)+"\">\n"+
+"        <input type=\"button\" value=\"Delete\" alt=\""+"Delete path #"+Integer.toString(k)+"\" onClick='Javascript:SpecOp(\""+pathOpName+"\",\"Delete\",\"path_"+Integer.toString(k)+"\")'/>\n"+
+"      </a>&nbsp;\n"+
+"    </td>\n"+
+"    <td class=\"value\">\n"+
+"      <input type=\"hidden\" name=\""+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(startPath)+"\"/>\n"+
+"      <input type=\"hidden\" name=\""+pathOpName+"\" value=\"\"/>\n"+
+"      <nobr>"+((startPath.length() == 0)?"(root)":org.apache.manifoldcf.ui.util.Encoder.bodyEscape(startPath))+"</nobr>\n"+
+"    </td>\n"+
+"  </tr>\n"
+          );
+          k++;
+        }
+      }
+      if (k == 0)
+      {
+        out.print(
+"  <tr>\n"+
+"    <td class=\"message\" colspan=\"2\">No folders chosen - all documents will be taken</td>\n"+
+"  </tr>\n"
+        );
+      }
+      out.print(
+"  <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+
+"  <tr>\n"+
+"    <td class=\"value\" colspan=\"2\">\n"+
+"      <nobr>\n"+
+"        <input type=\"hidden\" name=\"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"+
+"        <a name=\""+"path_"+Integer.toString(k)+"\">\n"
+      );
+	
+      String pathSoFar = (String)currentContext.get("specpath");
+      if (pathSoFar == null)
+        pathSoFar = "/";
+
+      // Grab next folder/project list
+      try
+      {
+        String[] childList;
+        childList = getChildFolders(pathSoFar);
+        if (childList == null)
+        {
+          // Illegal path - set it back
+          pathSoFar = "/";
+          childList = getChildFolders("/");
+          if (childList == null)
+            throw new ManifoldCFException("Can't find any children for root folder");
+        }
+        out.print(
+"          <input type=\"hidden\" name=\"specpath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pathSoFar)+"\"/>\n"+
+"          <input type=\"hidden\" name=\"pathop\" value=\"\"/>\n"+
+"          <input type=\"button\" value=\"Add\" alt=\"Add path\" onClick='Javascript:SpecOp(\"pathop\",\"Add\",\"path_"+Integer.toString(k+1)+"\")'/>\n"+
+"          &nbsp;"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pathSoFar)+"\n"
+        );
+        if (pathSoFar.length() > 0)
+        {
+          out.print(
+"          <input type=\"button\" value=\"-\" alt=\"Remove from path\" onClick='Javascript:SpecOp(\"pathop\",\"Up\",\"path_"+Integer.toString(k)+"\")'/>\n"
+          );
+        }
+        if (childList.length > 0)
+        {
+          out.print(
+"          <nobr>\n"+
+"            <input type=\"button\" value=\"+\" alt=\"Add to path\" onClick='Javascript:SpecAddToPath(\"path_"+Integer.toString(k)+"\")'/>&nbsp;\n"+
+"            <select multiple=\"false\" name=\"pathaddon\" size=\"4\">\n"+
+"              <option value=\"\" selected=\"selected\">-- Pick a folder --</option>\n"
+          );
+          int j = 0;
+          while (j < childList.length)
+          {
+            String folder = org.apache.manifoldcf.ui.util.Encoder.attributeEscape(childList[j]);
+            out.print(
+"              <option value=\""+folder+"\">"+folder+"</option>\n"
+            );
+            j++;
+          }
+          out.print(
+"            </select>\n"+
+"          </nobr>\n"
+          );
+        }
+      }
+      catch (ManifoldCFException e)
+      {
+        e.printStackTrace();
+        out.println(org.apache.manifoldcf.ui.util.Encoder.bodyEscape(e.getMessage()));
+      }
+      catch (ServiceInterruption e)
+      {
+        e.printStackTrace();
+        out.println(org.apache.manifoldcf.ui.util.Encoder.bodyEscape("Transient error - "+e.getMessage()));
+      }
+      out.print(
+"        </a>\n"+
+"      </nobr>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"</table>\n"
+      );
+    }
+    else
+    {
+      // Generate hiddens for the folders tab
+      i = 0;
+      k = 0;
+      while (i < ds.getChildCount())
+      {
+        SpecificationNode sn = ds.getChild(i++);
+        if (sn.getType().equals(SPEC_NODE_FOLDER))
+        {
+          String pathDescription = "_"+Integer.toString(k);
+          String startPath = sn.getAttributeValue(SPEC_ATTRIBUTE_VALUE);
+          out.print(
+"<input type=\"hidden\" name=\""+"specpath"+pathDescription+"\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(startPath)+"\"/>\n"
+          );
+          k++;
+        }
+      }
+      out.print(
+"<input type=\"hidden\" name=\"pathcount\" value=\""+Integer.toString(k)+"\"/>\n"
+      );
+    }
+    
+    // Document classes tab
     if (tabName.equals("Document Classes"))
     {
       out.print(
@@ -2214,7 +2433,6 @@ public class FilenetConnector extends or
     }
 
     // Security tab
-    int k;
     // Find whether security is on or off
     i = 0;
     boolean securityOn = true;
@@ -2449,6 +2667,79 @@ public class FilenetConnector extends or
       }
     }
 
+    y = variableContext.getParameter("pathcount");
+    if (y != null)
+    {
+      // Delete all path specs first
+      i = 0;
+      while (i < ds.getChildCount())
+      {
+        SpecificationNode sn = ds.getChild(i);
+        if (sn.getType().equals(SPEC_NODE_FOLDER))
+          ds.removeChild(i);
+        else
+          i++;
+      }
+
+      // Find out how many children were sent
+      int pathCount = Integer.parseInt(y);
+      // Gather up these
+      i = 0;
+      while (i < pathCount)
+      {
+        String pathDescription = "_"+Integer.toString(i);
+        String pathOpName = "pathop"+pathDescription;
+        y = variableContext.getParameter(pathOpName);
+        if (y != null && y.equals("Delete"))
+        {
+          // Skip to the next
+          i++;
+          continue;
+        }
+        // Path inserts won't happen until the very end
+        String path = variableContext.getParameter("specpath"+pathDescription);
+        SpecificationNode node = new SpecificationNode(SPEC_NODE_FOLDER);
+        node.setAttribute(SPEC_ATTRIBUTE_VALUE,path);
+
+        ds.addChild(ds.getChildCount(),node);
+        i++;
+      }
+
+      // See if there's a global add operation
+      String op = variableContext.getParameter("pathop");
+      if (op != null && op.equals("Add"))
+      {
+        String path = variableContext.getParameter("specpath");
+        SpecificationNode node = new SpecificationNode(SPEC_NODE_FOLDER);
+        node.setAttribute(SPEC_ATTRIBUTE_VALUE,path);
+        ds.addChild(ds.getChildCount(),node);
+      }
+      else if (op != null && op.equals("Up"))
+      {
+        // Strip off end
+        String path = variableContext.getParameter("specpath");
+        int k = path.lastIndexOf("/");
+        if (k <= 0)
+          path = "/";
+        else
+          path = path.substring(0,k);
+        currentContext.save("specpath",path);
+      }
+      else if (op != null && op.equals("AddToPath"))
+      {
+        String path = variableContext.getParameter("specpath");
+        String addon = variableContext.getParameter("pathaddon");
+        if (addon != null && addon.length() > 0)
+        {
+          if (path.length() <= 1)
+            path = "/" + addon;
+          else
+            path += "/" + addon;
+        }
+        currentContext.save("specpath",path);
+      }
+    }
+
     y = variableContext.getParameter("specsecurity");
     if (y != null)
     {
@@ -2695,6 +2986,40 @@ public class FilenetConnector extends or
 "  </tr>\n"+
 "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
     );
+    
+    // Handle Folders
+    i = 0;
+    boolean seenAny = false;
+    while (i < ds.getChildCount())
+    {
+      SpecificationNode spn = ds.getChild(i++);
+      if (spn.getType().equals(SPEC_NODE_FOLDER))
+      {
+        if (seenAny == false)
+        {
+          seenAny = true;
+        }
+        out.print(
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>Folders:</nobr></td>\n"+
+"    <td class=\"value\">\n"+
+"      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(spn.getAttributeValue(SPEC_ATTRIBUTE_VALUE))+"</nobr>\n"+
+"    </td>\n"+
+"  </tr>\n"
+        );
+      }
+    }
+    if (seenAny == false)
+    {
+      out.print(
+"  <tr><td class=\"message\" colspan=\"2\">All folders specified</td></tr>\n"
+      );
+    }
+    out.print(
+"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
+"\n"
+    );
+    
     // Find whether security is on or off
     i = 0;
     boolean securityOn = true;
@@ -2718,7 +3043,7 @@ public class FilenetConnector extends or
 "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
     );
     // Go through looking for access tokens
-    boolean seenAny = false;
+    seenAny = false;
     i = 0;
     while (i < ds.getChildCount())
     {
@@ -3109,6 +3434,92 @@ public class FilenetConnector extends or
     }
   }
 
+  protected class GetChildFoldersThread extends Thread
+  {
+    protected String[] folderPath;
+    protected String[] rval = null;
+    protected Throwable exception = null;
+
+    public GetChildFoldersThread(String[] folderPath)
+    {
+      super();
+      setDaemon(true);
+      this.folderPath = folderPath;
+    }
+
+    public void run()
+    {
+      try
+      {
+        rval = session.getChildFolders(folderPath);
+      }
+      catch (Throwable e)
+      {
+        this.exception = e;
+      }
+    }
+
+    public String[] getResponse()
+    {
+      return rval;
+    }
+
+    public Throwable getException()
+    {
+      return exception;
+    }
+
+  }
+
+
+  /** Get child folder names */
+  protected String[] doGetChildFolders(String[] folderPath)
+    throws FilenetException, ManifoldCFException, ServiceInterruption
+  {
+    while (true)
+    {
+      boolean noSession = (session==null);
+      getSession();
+      long currentTime;
+      GetChildFoldersThread t = new GetChildFoldersThread(folderPath);
+      try
+      {
+        t.start();
+        t.join();
+        Throwable thr = t.getException();
+        if (thr != null)
+        {
+          if (thr instanceof RemoteException)
+            throw (RemoteException)thr;
+          else if (thr instanceof FilenetException)
+            throw (FilenetException)thr;
+          else
+            throw (Error)thr;
+        }
+        return t.getResponse();
+      }
+      catch (InterruptedException e)
+      {
+        t.interrupt();
+        throw new ManifoldCFException("Interrupted: "+e.getMessage(),e,ManifoldCFException.INTERRUPTED);
+      }
+      catch (RemoteException e)
+      {
+        Throwable e2 = e.getCause();
+        if (e2 instanceof InterruptedException || e2 instanceof InterruptedIOException)
+          throw new ManifoldCFException(e2.getMessage(),e2,ManifoldCFException.INTERRUPTED);
+        if (noSession)
+        {
+          currentTime = System.currentTimeMillis();
+          throw new ServiceInterruption("Transient error connecting to filenet service: "+e.getMessage(),currentTime+60000L);
+        }
+        session = null;
+        lastSessionFetch = -1L;
+        continue;
+      }
+    }
+  }
+
   protected class GetMatchingObjectIdsThread extends Thread
   {
     protected String sql;
@@ -3145,7 +3556,7 @@ public class FilenetConnector extends or
     }
 
   }
-
+  
   /** Get matching object id's for a given query */
   protected String[] doGetMatchingObjectIds(String sql)
     throws FilenetException, ManifoldCFException, ServiceInterruption

Modified: incubator/lcf/trunk/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetImpl.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetImpl.java?rev=1071216&r1=1071215&r2=1071216&view=diff
==============================================================================
--- incubator/lcf/trunk/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetImpl.java (original)
+++ incubator/lcf/trunk/connectors/filenet/implementation/src/main/java/org/apache/manifoldcf/crawler/common/filenet/FilenetImpl.java Wed Feb 16 12:07:14 2011
@@ -146,6 +146,54 @@ public class FilenetImpl extends Unicast
     // Establishing a working session is enough to test connectivity
   }
 
+  /** Get the set of folder names that are children of the specified folder path. */
+  public String[] getChildFolders(String[] parentFolderPath)
+    throws FilenetException, RemoteException
+  {
+    setConnectionCredentials();
+    // Start at root.
+    Folder currentFolder = os.get_RootFolder();
+    // Work our way down through the path.  If the path turns out to be invalid,
+    // we return null.
+    int i = 0;
+    while (i < parentFolderPath.length)
+    {
+      // For each path segment, find the matching child folder
+      FolderSet folderSet = currentFolder.get_SubFolders();
+      currentFolder = null;
+      Iterator fldrIter = folderSet.iterator();
+      while (fldrIter.hasNext())
+      {
+        Folder folder = (Folder)fldrIter.next();
+        if (folder.get_FolderName().equals(parentFolderPath[i]))
+        {
+          currentFolder = folder;
+          break;
+        }
+      }
+      
+      // Found no folder object with the correct name; the setup must have changed.
+      if (currentFolder == null)
+        return null;
+      
+      i++;
+    }
+    
+    // We've located the correct parent folder object.  Construct a list of children to return.
+    ArrayList rval = new ArrayList();
+    FolderSet children = currentFolder.get_SubFolders();
+    Iterator childFolderIterator = children.iterator();
+    while (childFolderIterator.hasNext())
+    {
+      Folder child = (Folder)childFolderIterator.next();
+      rval.add(child.get_FolderName());
+    }
+    
+    String[] rvalArray = new String[rval.size()];
+    rval.toArray(rvalArray);
+    return rvalArray;
+  }
+  
   /** Get the set of available document classes. */
   public DocumentClassDefinition[] getDocumentClassesDetails()
     throws FilenetException, RemoteException

Modified: incubator/lcf/trunk/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenet.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenet.java?rev=1071216&r1=1071215&r2=1071216&view=diff
==============================================================================
--- incubator/lcf/trunk/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenet.java (original)
+++ incubator/lcf/trunk/connectors/filenet/interface/src/main/java/org/apache/manifoldcf/crawler/common/filenet/IFilenet.java Wed Feb 16 12:07:14 2011
@@ -54,6 +54,10 @@ public interface IFilenet extends Remote
   public void checkConnection()
     throws FilenetException, RemoteException;
 
+  /** Get the set of folder names that are children of the specified folder path. */
+  public String[] getChildFolders(String[] parentFolderPath)
+    throws FilenetException, RemoteException;
+
   /** Get the set of available document classes
   */
   public DocumentClassDefinition[] getDocumentClassesDetails()