Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Programmatischer Zugriff auf CCM / FileNet API

Im Rahmen eines Proof-Of-Concept durf­ten wir uns damit aus­ein­an­der­set­zen, wel­che Möglichkeiten es gibt, um auf die IBM Connections Content Manager bzw. FileNet API zuzu­grei­fen. Im fol­gen­den Beitrag möch­ten wir ein Ergebnis – den pro­gram­ma­ti­schen Zugriff auf die WebServices per JAVA – kurz vorstellen.

Im ers­ten Schritt haben wir ein Java Projekt erstellt und fol­gende Bibliotheken eingebunden

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

Die ver­wen­de­ten Filenet Bibliotheken fin­den sich z.B. im Installationsverzeichnis unter /FNCS/lib/.

Danach muss­ten die pas­sen­den Endpunkte, die FileNet-Domain, der ObjectStore-Bezeichner und eine Document-ID für den Test her­aus­ge­sucht wer­den. Für unser IBM Connections System erga­ben sich fol­gende 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 ver­wen­den, wel­ches Filenet stan­dard­mä­ßig mit­bringt. Hilfreich bei der Suche nach den URLs und Bezeichnern haben sich auch die Health Pages von FileNet erwie­sen, wel­che unter /dm/ und /P8CE/Health auf­ge­ru­fen wer­den können.

In einer Main-Methode und unter Zuhilfenahme der FileNet Core Bibliothek war dann schnell ein Zugriff auf das FileNet-Testdokument her­ge­stellt. Erwähnenswert ist hier­bei die Möglichkeit, SearchSQL an die Soap-Schnittstelle zu über­ge­ben, sowie die Möglichkeit, fein gra­nu­lar zu bestim­men, wel­che Properties der Dokumente bei den Abfragen tat­säch­lich gefüllt werden.

In einem ver­ein­fach­ten Beispiel wurde nach der Document ID gesucht und rekur­siv über die Ordner ite­riert, in denen das Dokument ent­hal­ten 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 bestim­men, haben wir noch einen wei­te­ren WebService abge­fragt – die ATOM Pub API von FileNet.

Hierbei bestand die Herausforderung darin, die rich­tige Folder ID des Elternordners zu bestim­men, selbst wenn das Dokument in einem tief ver­schach­tel­ten Unterordner liegt. Als Ergebnis muss­ten URLs nach fol­gen­dem 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, wel­che die ATOM Pub API lie­fert, sind alle not­wen­di­gen Informationen, wie auch der Link auf die Übersichtsseite des Dokumentes (Stichwort wid­ge­t­view) und die Community ID inner­halb 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
|

Related Posts

Pin It on Pinterest