Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/8 33 82-0

Programmatischer Zugriff auf CCM / FileNet API

Im Rahmen eines Proof-Of-Concept durften wir uns damit auseinandersetzen, welche Möglichkeiten es gibt, um auf die IBM Connections Content Manager bzw. FileNet API zuzugreifen. Im folgenden Beitrag möchten wir ein Ergebnis – den programmatischen Zugriff auf die WebServices per JAVA – kurz vorstellen.

Im ersten Schritt haben wir ein Java Projekt erstellt und folgende Bibliotheken eingebunden

  • Jace.jar
  • log4j.jar
  • stax-api.jar
  • xlxpScanner.jar
  • xlxpScannerUtils.jar

Die verwendeten Filenet Bibliotheken finden sich z.B. im Installationsverzeichnis unter /FNCS/lib/.

Danach mussten die passenden Endpunkte, die FileNet-Domain, der ObjectStore-Bezeichner und eine Document-ID für den Test herausgesucht werden. Für unser IBM Connections System ergaben sich folgende Werte:

SOAP_SERVICE_ENDPOINT = "https://connections-demo/wsi/FNCEWS40MTOM/";
ATOM_SERVICE_ENDPOINT = "https://connections-demo/dm/atom/library/";
P8_DOMAIN = "ICDomain";
P8_Object_STORE = "ICObjectStore";
DOC_ID = "{7E12F864-8968-490F-8B1B-657C0578AA82}";

Für die Recherche nach den Document ID´s kann man z.B. die Suche im /acce/ Frontend verwenden, welches Filenet standardmäßig mitbringt. Hilfreich bei der Suche nach den URLs und Bezeichnern haben sich auch die Health Pages von FileNet erwiesen, welche unter /dm/ und /P8CE/Health aufgerufen werden können.

In einer Main-Methode und unter Zuhilfenahme der FileNet Core Bibliothek war dann schnell ein Zugriff auf das FileNet-Testdokument hergestellt. Erwähnenswert ist hierbei die Möglichkeit, SearchSQL an die Soap-Schnittstelle zu übergeben, sowie die Möglichkeit, fein granular zu bestimmen, welche Properties der Dokumente bei den Abfragen tatsächlich gefüllt werden.

In einem vereinfachten Beispiel wurde nach der Document ID gesucht und rekursiv über die Ordner iteriert, in denen das Dokument enthalten ist.

...
private final static String SEARCH_SQL = "SELECT * FROM Document WHERE id =";
...
public static void main(final String[] args) throws Exception {            
        Connection conn = Factory.Connection.getConnection(SOAP_SERVICE_ENDPOINT);
        UserContext uc = UserContext.get();
        Subject subject = UserContext.createSubject(conn, WEB_SERVICE_USERNAME, WEB_SERVICE_PASSWORD, null);
        uc.pushSubject(subject);
        Domain domain = Factory.Domain.getInstance(conn, P8_DOMAIN);
        ObjectStore os = Factory.ObjectStore.fetchInstance(domain, P8_Object_STORE, null); 
        SearchScope scope = new SearchScope(os);
        SearchSQL sql = new SearchSQL(SEARCH_SQL + DOC_ID);
        EngineCollection docSet = scope.fetchObjects(sql, null, null, false);
        Iterator<?> docIterator = docSet.iterator();
        while (docIterator.hasNext()) {
            final Document doc = (Document) docIterator.next();
            System.out.println("Doc Name\t\t" + doc.get_Name());
            FolderSet folderSet = doc.get_FoldersFiledIn();
            Iterator<?> folderIterator = folderSet.iterator();
            // current version documents
            if (folderIterator.hasNext()) {
                while (folderIterator.hasNext()) {
                    Folder folder = (Folder) folderIterator.next();
                    int recursionLevel = getRecursionLevel(folder);
                    printOutFolderInfo(os, doc, folder, recursionLevel);
                }
            } 
            // older version documents without storing folder
            else {
                Folder folder = doc.get_SecurityFolder();
                int recursionLevel = getRecursionLevel(folder);
                printOutFolderInfo(os, doc, folder, recursionLevel);
            }
        }
        uc.popSubject();
    }

Da die Aufgabe auch noch darin bestand, die Connections URL für ein FileNet-Dokument zu bestimmen, haben wir noch einen weiteren WebService abgefragt – die ATOM Pub API von FileNet.

Hierbei bestand die Herausforderung darin, die richtige Folder ID des Elternordners zu bestimmen, selbst wenn das Dokument in einem tief verschachtelten Unterordner liegt. Als Ergebnis mussten URLs nach folgendem Muster erzeugt werden.

https://connections-demo/dm/atom/library/F0420CCF-2DAD-42C1-865B-41DFEB9DB450;9E670B76-FBF5-465C-AA70-C24F4D282084/document/7E12F864-8968-490F-8B1B-657C0578AA82/entry

In den XML-Responses, welche die ATOM Pub API liefert, sind alle notwendigen Informationen, wie auch der Link auf die Übersichtsseite des Dokumentes (Stichwort widgetview) und die Community ID innerhalb von Connections zu finden.

private static String getDocumentFeedURL(ObjectStore os, Folder folder, Document doc, int recLevel){
  String string = ATOM_SERVICE_ENDPOINT + getObjectStoreUUID(os) + ";" + getParentFolderUUID(folder, doc);
  return string  + "/document/" + getDocumentUUID(doc) + "/entry";
}

private static String getParentFolderUUID(Folder folder, final Document doc) {
  Folder get_Parent = folder.get_Parent();
  int recLevel = getRecursionLevel(get_Parent);
  if(recLevel > 0){
    return getParentFolderUUID(get_Parent, doc);
  }
  return getCleanId(get_Parent.get_Id());
}

private static String getObjectStoreUUID(ObjectStore store) {
  return getCleanId(store.get_Id());
}

private static String getDocumentUUID(Document doc) {
  return getCleanId(doc.get_Id());
}

private static String getCleanId(Id id) {
  return id.toString().replace("{", "").replace("}", "");
}

private static int getRecursionLevel(Folder folder) {
  return getInternalRecursionLevel(folder,0) - 2;
}

private static int getInternalRecursionLevel(Folder folder, Integer recLevel) {
  if(folder.get_Parent() != null){
    recLevel = getInternalRecursionLevel(folder.get_Parent(), recLevel) + 1;
  }
  return recLevel;
}

Quellen:

8. Oktober 2014
|

Kommentar hinterlassen


Pin It on Pinterest