IBM FileNet P8, バージョン 5.2.1            

DITA パブリッシングの操作

以下のタスクとコード例は、DITA パブリッシング関連の操作を示しています。

DITA プロジェクトのセットアップ

DITA パブリッシングをセットアップし、それが正しく動作することを確認するには、次のステップを実行します。このタスクを完了するには、DITA プロジェクト (DITA のトピックとマップ) が必要です。テスト用には、DITA Open Toolkit の samples ディレクトリーに簡単な DITA プロジェクトがあります。

  1. http://sourceforge.net/projects/dita-ot/ から DITA Open Toolkit を取得し、そのパッケージ (.zip または .tar.gz) を Content Engine サーバーまたは Content Engine サーバー上にマップ/マウントされているサーバーのインストール・ディレクトリーに展開します。例えば、パッケージを c:¥DITA-OT1.4.2.1 (Windows) または /DITA-OT1.4.2.1 (Windows 以外) に展開することもできます。
  2. Administration Console for Content Platform Engineを使用して、DITA Publishing Extensions をインストールします。詳細情報については、アドオン機能のオブジェクト・ストアへのインストールを参照してください。
    • DITA ドキュメント・クラスにプロパティーを追加または削除します。
    • 新しいコンポーネント関係のサブクラスを追加します。
    • DITA 特殊化のサポートを追加します。
    • コンポーネント関係オブジェクトのプロパティーを変更します (例えば、カスケード削除を有効にする)。
    • 文字列プロパティーのデフォルトの長さを変更します (デフォルト長は 64)。

    DITA 分類子 Java™ ソース・コード (DITAClassifier.java) は IBM® サポート・ポータルから入手できます。ソース・コード配布には、カスタマイズされた DITA 分類子の変更およびインストールのための指示が含まれます。ソース・コードは、「IBM FileNet® P8 Platform publication library」からダウンロードできます。

  3. オプション: DITA 特殊化またはカスタム・レンダリング・プラグインをサポートするように DITA Open Toolkit を変更します。インストラクションについては、DITA Open Toolkit のマニュアルを参照してください。
  4. オプション: p8dita.env ファイルを作成し、DITA Open Toolkit 環境を指定します。詳細については、p8dita.env ファイルの作成を参照してください。
  5. DITARenditionEngineConnection オブジェクトを作成します。このタスクを完了するには、Administration Console for Content Platform Engine または Content Engine API (「DITARenditionEngineConnection オブジェクトの作成」を参照) を使用できます。
  6. パブリッシュ・スタイル・テンプレートを作成します。このタスクを完了するには、Publishing Style Template Manager (『DITA Rendition Engine・スタイル・テンプレートの追加または変更 (Add or modify DITA Rendition Engine style templates』を参照)、または Content Engine API (『DITA 用のパブリッシュ・スタイル・テンプレートの作成』を参照) を使用できます。
  7. パブリッシュ・テンプレートを作成します。このタスクを完了するには、 IBM FileNet P8 Workplace または Content Engine API (『DITA 用のパブリッシュ・テンプレートの作成』を参照) を使用できます。
  8. DITA プロジェクトにチェックインします。ファイルを手動でチェックインするか (Administration Console for Content Platform Engine を使用)、DITA プロジェクト全体をインポートするプログラムを作成することができます。サンプルの DITA インポーターは IBM サポート・ポータルから入手できます。このサンプルは、「IBM FileNet P8 Platform publication library」からダウンロードできます。
  9. copy-only オプションを使用して、DITA プロジェクトをパブリッシュします。このタスクを完了するには、IBM FileNet P8 Workplace (『最初のドキュメントのパブリッシュ (Publish your first document)を参照』) または Content Engine API (『DITA プロジェクトのパブリッシング』を参照) を使用できます。 パブリッシュ操作が完了したら、インポートされた DITA プロジェクト・ファイルすべてが作業ディレクトリーにコピーされたことを確認します。また、作業ディレクトリーのプロジェクト・ファイルで長さが 0 のファイルを検索して、参照が欠落していないかを調べます。
  10. プロジェクトを再度パブリッシュします。ただし、今回は、「copy-only」オプションを false に設定し、変換タイプとして PDF を選択します。PDF が生成され、予期したとおりにチェックインされることを確認します。パブリッシュ操作が失敗した場合、DITA 作業ディレクトリーのパブリッシュ・フォルダー内にあるログ・ファイル (例えば、c:¥ditatemp¥ditapr-23445¥my_project_pdf.log または /tmp/ditatemp/ditapr-23445/my_project_pdf.log) を調べます。

p8dita.env ファイルの作成

DITA Open Toolkit の起動環境を静的に定義するには、次の操作を実行します。

  1. p8dita.env という名前のファイルを作成します。
  2. ファイルを編集して、CLASSPATH、ANT_HOME、および PATH の各環境変数を含めるようにします。
  3. ファイルをトップレベルの DITA Open Toolkit インストール・ディレクトリー (例えば、c:¥DITA-OT1.4.2.1 または /tmp/DITA-OT1.4.2.1) に保存します。

Microsoft Windows の p8dita.env ファイルの例を以下に示します。CLASSPATH、ANT_HOME、および PATH の各行は単一の別々な行にする必要があります。見やすくするために、ここでは複数行にしています。

p8dita.env の例

CLASSPATH=e:¥DITA-OT1.4¥lib¥avalon-framework-cvs-20020806.jar;
    e:¥DITA-OT1.4¥lib¥batik.jar;e:¥DITA-OT1.4¥lib¥dost.jar;
    e:¥DITA-OT1.4¥lib¥fop.jar;e:¥DITA-OT1.4¥lib¥icu4j.jar;
    e:¥DITA-OT1.4¥lib¥resolver.jar;e:¥DITA-OT1.4¥lib¥xalan.jar;
    e:¥DITA-OT1.4¥lib¥xercesImpl.jar;e:¥DITA-OT1.4¥lib¥xml-apis.jar;
    e:¥DITA-OT1.4C:¥WINDOWS¥system32;
ANT_HOME=e:¥DITA-OT1.4¥tools¥ant
PATH=e:¥DITA-OT1.4¥tools¥ant¥bin;
E:¥Program Files¥IBM¥WebSphere¥AppServer¥java¥bin;%PATH%

Windows 以外の p8dita.env ファイルの例を以下に示します。

p8dita.env の例

CLASSPATH=/DITA-OT1.4/lib/avalon-framework-cvs-20020806.jar;
    /DITA-OT1.4/lib/batik.jar;/DITA-OT1.4/lib/dost.jar;
    /DITA-OT1.4/lib/fop.jar;/DITA-OT1.4/lib/icu4j.jar;
    /DITA-OT1.4/lib/resolver.jar;/DITA-OT1.4/lib/xalan.jar;
    /DITA-OT1.4/lib/xercesImpl.jar;/DITA-OT1.4/lib/xml-apis.jar;
    /DITA-OT1.4;
ANT_HOME=/DITA-OT1.4/tools/ant
PATH=/DITA-OT1.4/tools/ant/bin;
/opt/IBM/WebSphere/AppServer/java/bin;%PATH%

DITA 関係 (DITA Relationships) のナビゲート

DITA ドキュメントの複合ドキュメント構造をたどって (つまりトラバース (traverse) して)、表示するコード例を以下に示します。出力フォーマットは次のとおりです。

    /[Component relationship class] => [Document class]: [Document title] [Document id]

次に例を示します。

   /DitaTopicref => DitaConcept: Lawnmower {78C7186D-5DB6-462A-8F91-B461A7C01870}

ここで、子ドキュメントのタイトルは「Lawnmower」であり、子ドキュメントと親ドキュメント間のコンポーネント関係を表すクラスは DitaTopicref であり、子ドキュメントのクラスは DitaConcept です。

このコードでは循環関係も検出されます。ドキュメント用に表示されるいずれかの親コンポーネントが自分自身である場合、子ドキュメントの横に「[circular reference]」と表示されます。

複合ドキュメントについては、「複合ドキュメント」を参照してください。DITA 固有の関係については、「DITA 関係 (DITA Relationships)」を参照してください。

Java の例

private static void navigateDitaStructure(
        Document rootParent)
{
    String[] titlePropName = { "DitaTitle", "DocumentTitle" };
    traverseCompoundDocument(rootParent, null, 0, null, titlePropName);
}

// 複合ドキュメント構造をトラバース
private static void traverseCompoundDocument(
        Document parent, 
        ComponentRelationship crParent, // 親に対するコンポーネント関係 (初回呼び出し時 null)
        int level,                      // インデント・レベル (初回呼び出し時 0)
        HashMap circRefMap,             // 循環参照のチェック (初回呼び出し時 null)
        String[] titlePropName)         // ドキュメント・タイトルのプロパティー名
{
    
    // メッセージを初期化
    String message = "";
    
    // ドキュメント・レベルに基づいてインデント
    for (int count = 0; count < level; count++)
    {
        message += "    ";
    }
    message += "/";
    
    // コンポーネント関係のタイプを表示
    if (crParent != null)
    {
        message += crParent.getClassName() + " => ";
    }
    
    // ドキュメント・タイトルを表示
    String title = getDocTitle(parent, titlePropName);
    if (title == null)
    {
        title = "???";
    }
    message += parent.getClassName() + ": " + title + " " + parent.get_Id();

    // 循環参照チェック用のマップを作成
    if (circRefMap == null)
    {
        circRefMap = new HashMap();
    }

    // 循環参照をチェック
    boolean circRef = false;
    String parentKey = parent.get_Id().toString();
    if (circRefMap.containsKey(parentKey) == true)
    {
        circRef = true;
        message += " [circular reference]";
    }
    circRefMap.put(parentKey, parent);
    
    // 出力メッセージ
    System.out.println(message);
    if (circRef == true)
    {
        return;
    }
        
    // Iterate through child documents.
    ComponentRelationshipSet crSet = parent.get_ChildRelationships();
    Iterator iter = crSet.iterator();
    while(iter.hasNext())
    {
        // Make recursive call.
        ComponentRelationship crChild = (ComponentRelationship) iter.next();
        Document child = crChild.get_ChildComponent();
        if (child != null)
        {
            traverseCompoundDocument(child, crChild, level + 1, circRefMap, titlePropName);
        }
    }   
            
    // Remove document from circular reference map.
    circRefMap.remove(parentKey);
    
}

// ドキュメント・タイトルを取得
private static String getDocTitle(
        Document doc,
        String[] propName)
{

    String title = null;
    doc.refresh();
    for (int ele = 0; ele < propName.length; ele++)
    {
        if (doc.getProperties().isPropertyPresent(propName[ele]) == true)
        {
            title = doc.getProperties().get(propName[ele]).getStringValue();
            if (title != null)
            {
                break;
            }
        }
    }
    return title;    
}

C# の例

private static void NavigateDitaStructure(
        IDocument rootParent)
{
    TraverseCompoundDocument(rootParent, null, 0, null,
                        "DitaTitle", "DocumentTitle");
}

// 複合ドキュメント構造をトラバース
private static void TraverseCompoundDocument(
        IDocument parent, 
        IComponentRelationship crParent,    // 親に対するコンポーネント関係 (初回呼び出し時 null)
        int level,                      // インデント・レベル (初回呼び出し時 0)
        Hashtable circRefMap,               // 循環参照のチェック (初回呼び出し時 null)
        params String[] titlePropName)      // ドキュメント・タイトルのプロパティー名
{

    // メッセージを初期化
    String message = "";

    // ドキュメント・レベルに基づいてインデント
    for (int count = 0; count < level; count++)
    {
        message += "    ";
    }
    message += "/";

    // コンポーネント関係のタイプを表示
    if (crParent != null)
    {
        message += crParent.GetClassName() + " => ";
    }

    // ドキュメント・タイトルを表示
    String title = GetDocTitle(parent, titlePropName);
    if (title == null)
    {
        title = "???";
    }
    message += parent.GetClassName() + ": " + title + " " + parent.Id;

    // 循環参照チェック用のマップを作成
    if (circRefMap == null)
    {
        circRefMap = new Hashtable();
    }

    // 循環参照をチェック
    Boolean circRef = false;
    String parentKey = parent.Id.ToString();
    if (circRefMap.ContainsKey(parentKey) == true)
    {
        circRef = true;
        message += " [circular reference]";
    }
    if (circRefMap.ContainsKey(parentKey) == false)
    {
        circRefMap.Add(parentKey, parent);
    }

    // 出力メッセージ
    Debug.WriteLine(message);
    if (circRef == true)
    {
        return;
    }
    
    // Iterate through child documents.
    IComponentRelationshipSet crSet = parent.ChildRelationships;
    foreach (IComponentRelationship crChild in crSet)
    {
        // Make recursive call.
        IDocument child = crChild.ChildComponent;
        if (child != null)
        {
            TraverseCompoundDocument(child, crChild, level + 1, circRefMap, titlePropName);
        }
    }   
        
    // Remove document from circular reference map.
    circRefMap.Remove(parentKey);

}

// ドキュメント・タイトルを取得
private static String GetDocTitle(
        IDocument doc,
        params String[] propName)
{
    String title = null;
    doc.Refresh();
    foreach (String titlePropName in propName)
    {
        if (doc.Properties.IsPropertyPresent(titlePropName) == true)
        {
            title = (String) doc.Properties[titlePropName];
            if (title != null)
            {
                break;
            }
        }
    }
    return title;    
}
        

DITA メタデータの検索

プロパティー値に基づいて DITA ドキュメントの簡単な照会を実行するコード例を以下に示します。照会対象のクラス DitaBase は、標準の DITA 情報タイプ (concept、glossentry、reference、task、および topic) を表すすべての DITA ドキュメント・サブクラスの親クラスです。

照会実行のバックグラウンド情報については、『照会』を参照してください。DITA ドキュメントの照会の詳細については、DITA 照会を参照してください。

Java の例

public static void queryDitaAuthor(
        ObjectStore objStore,
        String userName)
{
    // SQL オブジェクトを作成
    SearchSQL sqlObject = new SearchSQL();
    sqlObject.setSelectList("db.DitaTitle, db.Id");
    sqlObject.setFromClauseInitialValue("DitaBase", "db", true);
    sqlObject.setWhereClause("IsCurrentVersion = true "
                             + "AND '" + userName + "' IN db.DitaAuthors");        
    System.out.println("SQL: " + sqlObject.toString()); 

    // 照会を実行
    SearchScope search = new SearchScope(objStore);
    RepositoryRowSet queryRows = search.fetchRows(
            sqlObject, new Integer(10), null, new Boolean(true));

    // 返された行を反復処理
    int rowCount = 0;
    Iterator iter = queryRows.iterator();
    while (iter.hasNext()) 
    {
        RepositoryRow row = (RepositoryRow) iter.next();
            
        String ditaTitle 
                = row.getProperties().get("DitaTitle").getStringValue();
        Id docId = row.getProperties().get("Id").getIdValue();
            
        rowCount++;
        System.out.print(" row " + rowCount + ":");
        System.out.print(" Id=" + docId.toString());
        if (ditaTitle != null) 
        {
            System.out.print(" DitaTitle=" + ditaTitle);
        }
        System.out.println();
    }            
    if (rowCount == 0)
    {
        System.out.println("No rows returned for query");
    }
    
}

C# の例

public static void queryDitaAuthor(
        IObjectStore objStore,
        String userName)
{
    // SQL オブジェクトを作成
    SearchSQL sqlObject = new SearchSQL();
    sqlObject.SetSelectList("db.DitaTitle, db.Id");
    sqlObject.SetFromClauseInitialValue("DitaBase", "db", true);
    sqlObject.SetWhereClause("IsCurrentVersion = true "
                         + "AND '" + userName + "' IN db.DitaAuthors");        
    Debug.WriteLine("SQL: " + sqlObject.ToString()); 

    // 照会を実行
    SearchScope search = new SearchScope(objStore);
    IRepositoryRowSet queryRows = search.FetchRows(
            sqlObject, 10, null, true);

    // 返された行を反復処理
    int rowCount = 0;
    foreach (IRepositoryRow row in queryRows)
    {
        String ditaTitle 
                = row.Properties
                  .GetProperty("DitaTitle").GetStringValue();
        Id docId = row.Properties.GetProperty("Id").GetIdValue();
            
        rowCount++;
        Debug.Write(" row " + rowCount + ":");
        Debug.Write(" Id=" + docId.ToString());
        if (ditaTitle != null) 
        {
            Debug.Write(" DitaTitle=" + ditaTitle);
        }
        Debug.WriteLine("");
    }            
    if (rowCount == 0)
    {
        Debug.WriteLine("No rows returned for query");
    }

}

特定の子ドキュメントのすべての親ドキュメントを検索するコード例を以下に示します。この照会は、特定の DITA トピックを参照するトピックすべてを特定しようとする場合などに役立ちます。

Java の例

public static void queryDitaComponent(
        ObjectStore objStore,
        String childVerSeriesId,    // Child document version series id.
        String tableName,           // 例: "DitaTopicref" または "DitaConref"
        String propName,            // 例: "DitaId" または "DitaElementId"
        String propValue)           // プロパティー値
{
    // Show parameters.
    System.out.println("Parameter childVerSeriesId: " + childVerSeriesId);
    System.out.println("Parameter tableName: " + tableName);
    System.out.println("Parameter propName: " + propName);
    System.out.println("Parameter propValue: " + propValue);
    System.out.println("");
    
    // SQL オブジェクトを作成
    // 注: "ChildComponent" を "ChildVersionSeries" の代わりに
    // "ChildVersionSeries" to query for a specific child document. The
    // 以下の照会は、子バージョン・シリーズ内の任意のドキュメントに
    // バインドするコンポーネント関係をすべてキャッチ
    SearchSQL sqlObject = new SearchSQL();
    sqlObject.setSelectList("d.id, d.DitaTitle"); 
    sqlObject.setFromClauseInitialValue("Document", "d", true);
    sqlObject.setFromClauseAdditionalJoin(JoinOperator.INNER, tableName, "cr", "d.This", JoinComparison.EQUAL, "cr.ParentComponent", false);
    sqlObject.setWhereClause("cr.ChildVersionSeries = OBJECT(" + childVerSeriesId + ") "
                             + "AND cr." + propName + " = '" + propValue + "'");
    System.out.println("SQL: " + sqlObject.toString()); 
    
    // 照会を実行
    SearchScope search = new SearchScope(objStore);
    RepositoryRowSet queryRows = search.fetchRows(
            sqlObject, new Integer(10), null, new Boolean(true));

    // 返された行を反復処理
    int rowCount = 0;
    Iterator iter = queryRows.iterator();
    while (iter.hasNext()) 
    {
        RepositoryRow row = (RepositoryRow) iter.next();
            
        String ditaTitle 
                = row.getProperties().get("DitaTitle").getStringValue();
        Id docId = row.getProperties().get("Id").getIdValue();
            
        rowCount++;
        System.out.print(" row " + rowCount + ":");
        System.out.print(" Id=" + docId.toString());
        if (ditaTitle != null) 
        {
            System.out.print(" DitaTitle=" + ditaTitle);
        }
        System.out.println();
    }            
    if (rowCount == 0)
    {
        System.out.println("No rows returned for query");
    }
    
}

C# の例

public static void QueryDitaComponent(
        IObjectStore objStore,
        String childVerSeriesId,    // Child document version series id.
        String tableName,           // 例: "DitaTopicref" または "DitaConref"
        String propName,            // 例: "DitaId" または "DitaElementId"
        String propValue)           // プロパティー値
{   
    // Show parameters.
    Debug.WriteLine("Parameter childVerSeriesId: " + childVerSeriesId);
    Debug.WriteLine("Parameter tableName: " + tableName);
    Debug.WriteLine("Parameter propName: " + propName);
    Debug.WriteLine("Parameter propValue: " + propValue);
    Debug.WriteLine("");

    // SQL オブジェクトを作成
    // 注: "ChildComponent" を "ChildVersionSeries" の代わりに
    // "ChildVersionSeries" to query for a specific child document. The
    // 以下の照会は、子バージョン・シリーズ内の任意のドキュメントに
    // バインドするコンポーネント関係をすべてキャッチ
    SearchSQL sqlObject = new SearchSQL();
    sqlObject.SetSelectList("d.id, d.DitaTitle"); 
    sqlObject.SetFromClauseInitialValue("Document", "d", true);
    sqlObject.SetFromClauseAdditionalJoin(JoinOperator.INNER, tableName, "cr", "d.This", JoinComparison.EQUAL, "cr.ParentComponent", false);
    sqlObject.SetWhereClause("cr.ChildVersionSeries = OBJECT(" + childVerSeriesId + ") "
                         + "AND cr." + propName + " = '" + propValue + "'");
    Debug.WriteLine("SQL: " + sqlObject.ToString()); 

    // 照会を実行
    SearchScope search = new SearchScope(objStore);
    IRepositoryRowSet queryRows = search.FetchRows(
            sqlObject, 10, null, true);

    // 返された行を反復処理
    int rowCount = 0;
    foreach (IRepositoryRow row in queryRows)
    {
        String ditaTitle
                = row.Properties["DitaTitle"].ToString();
        String docId = row.Properties["Id"].ToString();
        
        rowCount++;
        Debug.Write(" row " + rowCount + ":");
        Debug.Write(" Id=" + docId);
        if (ditaTitle != null) 
        {
            Debug.Write(" DitaTitle=" + ditaTitle);
        }
        Debug.WriteLine("");
    }            
    if (rowCount == 0)
    {
        Debug.WriteLine("No rows returned for query");
    }

}

DITARenditionEngineConnection オブジェクトの作成

DITA ドキュメントのパブリッシュに必要なオブジェクトの 1 つに、DITA Rendition Engine への接続があります。このような接続を確立するには、次のステップ・シーケンス (以下のコード例で説明) に従います。

  1. パブリッシング構成を取得または追加します。
  2. エンジン接続オブジェクトを作成し、接続のプロパティーを設定します。
  3. 新たに作成したエンジン接続を使用して構成を保存します。

DITARenditionEngineConnection オブジェクトの詳細については、DITA パブリッシングを参照してください。

Java の例

public static PublishingConfiguration createDitaConnection(
        Domain domain,
        String ditaHome,        // Example: C:/DITA-OT1.4.2.1 or /tmp/DITA-OT1.4.2.1
        String ditaWorkingDir)  // Example: C:/Temp or /tmp
{
    // Get default site.
    Site site = domain.get_DefaultSite();

    // サイトのパブリッシング構成を取得
    SubsystemConfigurationList scl 
            = site.get_SubsystemConfigurations();
    PublishingConfiguration pubConfig = getPublishingConfiguration(scl);
    if (pubConfig == null)
    {
        // Add new configuration since one does not already exist. 
        pubConfig = addPublishingConfiguration(scl);
    }
            
    // 新しいエンジン接続インスタンスを作成
    DITARenditionEngineConnection newEngineConn 
        = Factory.DITARenditionEngineConnection.createInstance(
          domain, null);
    
    // エンジン接続表示名を設定
    SimpleDateFormat timeStamp = new SimpleDateFormat("yyyyMMdd-HHmmss-SSS");
    String displayName = "DREC-" + timeStamp.format(new Date());
    newEngineConn.set_DisplayName(displayName);
    
    // エンジン接続のプロパティーを設定
    newEngineConn.set_DITADatabaseTimeout(new Integer(3600));
    newEngineConn.set_DITAHome(ditaHome);
    newEngineConn.set_DITAWorkingDirectory(ditaWorkingDir);
    newEngineConn.set_Site(site);
    
    // エンジン接続を保存し、パブリッシング構成に関連付ける
    newEngineConn.save(RefreshMode.REFRESH);
    pubConfig.set_DITARenditionEngineConnection(newEngineConn);
    System.out.println("DITA engine connection created: " 
                       + newEngineConn.get_Id());   
            
    // Save publishing configuration changes.
    site.save(RefreshMode.REFRESH);
    System.out.println("DITA engine connection associated with site: " 
                       + site.get_Id());

    // パブリッシング構成を再取得し ID を取得
    scl = site.get_SubsystemConfigurations();
    pubConfig = getPublishingConfiguration(scl);
    System.out.println(
            "DITA engine connection associated with publishing configuration: "
            + pubConfig.get_Id());      

    // Return publishing configuration.
    return pubConfig;

}

// 新しいパブリッシング構成を追加
private static PublishingConfiguration addPublishingConfiguration(
        SubsystemConfigurationList scl)
{
    // Create new publishing configuration.
    PublishingConfiguration pubConfig 
            = Factory.PublishingConfiguration.createInstance();
    pubConfig.set_DispatcherEnabled(Boolean.TRUE);
    pubConfig.set_DispatcherWaitInterval(new Integer(300));
    pubConfig.set_QueueItemDatabaseTimeout(new Integer(600));
    pubConfig.set_QueueItemMaxDispatchers(new Integer(2));
    pubConfig.set_QueueItemRetryCount(new Integer(3));
    
    // パブリッシング構成を追加
    scl.add(pubConfig);
    return pubConfig;
}

// 既存のパブリッシング構成 (ある場合) を取得
private static PublishingConfiguration getPublishingConfiguration(
        SubsystemConfigurationList scl)
{
    // Cycle through subsystem configurations.
    Iterator iter = scl.iterator();
    while (iter.hasNext() == true)
    {
        // Get next configuration.
        SubsystemConfiguration subConfig 
                = (SubsystemConfiguration) iter.next();
        
        // Check if publishing configuration.
        if (subConfig instanceof PublishingConfiguration)
        {
            return (PublishingConfiguration) subConfig;
        }
    }
    return null;
    
}

C# の例

public static IPublishingConfiguration CreateDitaConnection(
        IDomain domain,
        String ditaHome,        // Example: C:/DITA-OT1.4.2.1 or /tmp/DITA-OT1.4.2.1
        String ditaWorkingDir)  // Example: C:/Temp or /tmp
{
    // Get default site.
    ISite site = domain.DefaultSite;

    // サイトのパブリッシング構成を取得
    ISubsystemConfigurationList scl 
            = site.SubsystemConfigurations;
    IPublishingConfiguration pubConfig = GetPublishingConfiguration(scl);
    if (pubConfig == null)
    {
        // Add new configuration since one does not already exist. 
        pubConfig = AddPublishingConfiguration(scl);
    }

    // 新しいエンジン接続インスタンスを作成
    IDITARenditionEngineConnection newEngineConn 
            = Factory.DITARenditionEngineConnection.CreateInstance(
                domain, null);

    // エンジン接続表示名を設定
    String displayName = "DREC-" + DateTime.Now.ToString("yyyyMMdd-HHmmss-fff");
    newEngineConn.DisplayName = displayName;

    // エンジン接続のプロパティーを設定
    newEngineConn.DITADatabaseTimeout = 3600;
    newEngineConn.DITAHome = ditaHome;
    newEngineConn.DITAWorkingDirectory = ditaWorkingDir;
    newEngineConn.Site = site;

    // エンジン接続を保存し、パブリッシング構成に関連付ける
    newEngineConn.Save(RefreshMode.REFRESH);
    pubConfig.DITARenditionEngineConnection = newEngineConn;
    Debug.WriteLine("DITA engine connection created: " 
                   + newEngineConn.Id); 
        
    // Save publishing configuration changes.
    site.Save(RefreshMode.REFRESH);
    Debug.WriteLine("DITA engine connection associated with site: " 
                   + site.Id);

    // パブリッシング構成を再取得し ID を取得
    scl = site.SubsystemConfigurations;
    pubConfig = GetPublishingConfiguration(scl);
    Debug.WriteLine(
            "DITA engine connection associated with publishing configuration: "
            + pubConfig.Id);        
        
    // Return publishing configuration.
    return pubConfig;

}

// 新しいパブリッシング構成を追加
private static IPublishingConfiguration AddPublishingConfiguration(
        ISubsystemConfigurationList scl)
{
    // Create new publishing configuration.
    IPublishingConfiguration pubConfig
            = Factory.PublishingConfiguration.CreateInstance();
    pubConfig.DispatcherEnabled = true;
    pubConfig.DispatcherWaitInterval = 300;
    pubConfig.QueueItemDatabaseTimeout = 600;
    pubConfig.QueueItemMaxDispatchers = 2;
    pubConfig.QueueItemRetryCount = 3;

    // パブリッシング構成を追加
    scl.Add(pubConfig);
    return pubConfig;
}

// 既存のパブリッシング構成 (ある場合) を取得
private static IPublishingConfiguration GetPublishingConfiguration(
        ISubsystemConfigurationList scl)
{
    // Cycle through subsystem configurations.
    foreach (ISubsystemConfiguration subConfig in scl)
    {           
        // Check if publishing configuration.
        if (subConfig is IPublishingConfiguration)
        {
            return (IPublishingConfiguration) subConfig;
        }
    }
    return null;

}

DITA 用のパブリッシュ・スタイル・テンプレートの作成

DITA パブリッシングでは、パブリッシュ・スタイル・テンプレート (IBM FileNet P8 パブリッシング・フレームワークにより提供される) を使用して、Rendition Engineがソース・ドキュメントを別の形式に変換する方法を指定します。DITA パブリッシングのパブリッシュ・スタイル・テンプレートは、次の固有の変換オプションを使用します。

  • ditaval-version-series-id (オプション): DITA プロジェクトのパブリッシュのため、DITA Open Toolkit で使用される DITAVAL ドキュメント (DITA 処理プロファイル) のバージョン・シリーズ・オブジェクトの ID。未指定の場合、ツールキットで処理プロファイルが使用されません。
  • trans-type: DITA Open Toolkit によって実行される変換のタイプ。デフォルトは、PDF です。
  • copy-only: IBM FileNet P8 システム外の処理のため、DITA マップとその参照されるすべての子を DITA 作業ディレクトリーにコピーすることを指定します。

また、スタイル・テンプレートの PublishID プロパティーを DITA に関連付けられている発行イベント・ハンドラー (例えば、PublishRequestDITAPDFHandler) に設定する必要があります。

IBM FileNet P8 パブリッシング・フレームワークにより提供される標準のパブリッシュ・スタイル・テンプレートの詳細については、『公開』および『公開オブジェクトの操作』を参照してください。

Java の例

public static PublishStyleTemplate createDitaStyleTemplate(
        ObjectStore objStore)
{
    // Create instance.
    PublishStyleTemplate pubStyleTemplate 
        = Factory.PublishStyleTemplate.createInstance(objStore);
    
    // テンプレート・タイトルを設定
    SimpleDateFormat timeStamp = new SimpleDateFormat("yyyyMMdd-HHmmss-SSS");
    String title = "DITAPublishStyle-" + timeStamp.format(new Date());
    pubStyleTemplate.set_Title(title);

    // テンプレート・フォーマットを設定
    StringList formats = Factory.StringList.createList();
    formats.add("text/xml");
    pubStyleTemplate.set_InputFormats(formats);
    
    // テンプレート変換オプションを設定
    final String TRANS_OPTIONS =
        "<dita-options>"+
            "<ditaval-version-series-id>{DE42374D-B04B-4F47-A62E-CAC9AC9A5719}</ditaval-version-series-id>" +
            "<ditaval-title>Dev. Guide Processing Profile<ditaval-title>"+
            "<trans-type>PDF</trans-type>"+
            "<copy-only>false</copy-only>"+
        "</dita-options>";
    pubStyleTemplate.set_TransformationOptions(TRANS_OPTIONS.getBytes("UTF-16LE"));

    // テンプレート出力フォーマットを PDF として設定
    pubStyleTemplate.set_OutputFormat("application/pdf");
    
    // イベント・ハンドラーを設定
    pubStyleTemplate.set_ProviderID("PublishRequestDITAPDFHandler");
    
    // テンプレートを保存
    pubStyleTemplate.save(RefreshMode.REFRESH);
    System.out.println("Publish style template created: " 
                       + pubStyleTemplate.get_Id());
    return pubStyleTemplate;
    
}

C# の例

public static IPublishStyleTemplate CreateDitaStyleTemplate(
        IObjectStore objStore)
{
    // Create instance.
    IPublishStyleTemplate pubStyleTemplate 
            = Factory.PublishStyleTemplate.CreateInstance(objStore);

    // テンプレート・タイトルを設定
    String title = "DITAPublishStyle-" 
                 + DateTime.Now.ToString("yyyyMMdd-HHmmss-fff");
    pubStyleTemplate.Title = title;

    // テンプレート・フォーマットを設定
    IStringList formats = Factory.StringList.CreateList();
    formats.Add("text/xml");
    pubStyleTemplate.InputFormats = formats;

    // テンプレート変換オプションを設定
    String TRANS_OPTIONS =
        "<dita-options>"+
            "<ditaval-version-series-id></ditaval-version-series-id>" +
            "<trans-type>pdf</trans-type>"+
            "<copy-only>false</copy-only>"+
        "</dita-options>";
    System.Text.ASCIIEncoding encoding 
            = new System.Text.ASCIIEncoding();
    pubStyleTemplate.TransformationOptions 
            = encoding.GetBytes(TRANS_OPTIONS);

    // テンプレート出力フォーマットを PDF として設定
    pubStyleTemplate.OutputFormat = "application/pdf";

    // イベント・ハンドラーを設定
    pubStyleTemplate.ProviderID = "PublishRequestDITAPDFHandler";

    // テンプレートを保存
    pubStyleTemplate.Save(RefreshMode.REFRESH);
    Debug.WriteLine("Publish style template created: " 
                    + pubStyleTemplate.Id);
    return pubStyleTemplate;

}

DITA 用のパブリッシュ・テンプレートの作成

DITA パブリッシングでは、パブリッシュ・テンプレート (IBM FileNet P8 パブリッシング・フレームワークに備わっている) を使用して、パブリッシング要求のオプションを指定します。DITA パブリッシングのパブリッシュ・テンプレートでは、パブリッシュ・スタイル・テンプレートを指定する必要があります。パブリッシュ・テンプレートにスタイル・テンプレートが関連付けられていない場合、ドキュメントのパブリッシュで、ソース・ドキュメントのコピー (DITA マップ) が参照されるコンポーネントなしで、オブジェクト・ストアの出力フォルダー内に作成されます。

IBM FileNet P8 パブリッシング・フレームワークにより提供される標準のパブリッシュ・テンプレートの詳細については、『公開』および『公開オブジェクトの操作』を参照してください。

Java の例

public static PublishTemplate createDitaTemplate(
        ObjectStore objStore,
        String ditaOutputFolder,    // 例: /Publication
        boolean copyOnly)           // Set to false for DITA Publishing.
{
    // インスタンスを作成
    PublishTemplate pubTemplate. 
            = Factory.PublishTemplate.createInstance(objStore);

    // テンプレート・タイトルを設定
    SimpleDateFormat timeStamp = new SimpleDateFormat("yyyyMMdd-HHmmss-SSS");       
    String title = "DITAPublish-" + timeStamp.format(new Date());
    pubTemplate.getProperties().putValue("DocumentTitle", title);
    
    // テンプレート・コンテンツのコンテンツ転送エレメントを作成
    final String PUBLISH_TEMPLATE_CONTENT 
            = buildTemplateContent(ditaOutputFolder);
    ByteArrayInputStream inputStream 
            = new ByteArrayInputStream(PUBLISH_TEMPLATE_CONTENT.getBytes());
    ContentTransfer contentElement 
            = Factory.ContentTransfer.createInstance();
    contentElement.setCaptureSource(inputStream);
    contentElement.set_RetrievalName("DitaPublishTemplate.xml");
    contentElement.set_ContentType("application/x-filenet-publishtemplate");
    
    // コンテンツ転送エレメントを追加
    ContentElementList cel = Factory.ContentElement.createList();
    cel.add(contentElement);
    pubTemplate.set_ContentElements(cel);
    
    // スタイル・テンプレートを設定 (create-style-template スニペットを呼び出し)
    if (copyOnly == false)
    {
        PublishStyleTemplate pubStyleTemplate 
            = SnippetsAdvancedDocManagement.createStyleTemplate(objStore);
        pubTemplate.set_StyleTemplate(pubStyleTemplate);
    }

    // チェックインおよび保存
    // パブリッシングでは公開テンプレートの現在のメジャー・バージョン
    // the current major version on the publish template.
    pubTemplate.checkin(AutoClassify.DO_NOT_AUTO_CLASSIFY, 
                        CheckinType.MAJOR_VERSION);
    pubTemplate.save(RefreshMode.REFRESH);
    System.out.println("Publish template created: " 
                       + pubTemplate.get_Id());
    return pubTemplate;     
   
}

// テンプレートのコンテンツを作成
private static String buildTemplateContent(
        String ditaOutputFolder)    // 例: /Publication
{
    final String VALUE_ISSOURCEDEPENDENT = "true";

    // パブリッシュ・テンプレートのコンテンツ
    final String PUBLISH_TEMPLATE_CONTENT =
        "<?xml version=¥"1.0¥" ?>" +
        "<publishtemplatecontent>" +
        "<version>2.0.1</version>" +
        "<newinstructions>" +
            "<issourcedependent>" + VALUE_ISSOURCEDEPENDENT + "</issourcedependent>" +
            "<outputfoldername>" + ditaOutputFolder + "</outputfoldername>" +
            "<applyproperties>" +
                "<classdescriptionname>Document</classdescriptionname>" +
                "<properties>" +
                "<property>" +
                    "<name>DocumentTitle</name>" +
                    "<value>MyNewDITAPubTitle</value>" +
                "</property>" +
                "</properties>" +
            "</applyproperties>" +
            "<applysecurity>" +
                "<from>default</from>" + // クラス定義からセキュリティーを適用する
            "</applysecurity>" +
        "</newinstructions>" +
        "<republishinstructions>" +
            "<versionablerepublishtype>versionandkeep</versionablerepublishtype>" +
            "<nonversionablerepublishtype>addandkeep</nonversionablerepublishtype>" +
            "<applypropertiesfrom>destination</applypropertiesfrom>" +
            "<applysecurityfrom>destination</applysecurityfrom>" +
        "</republishinstructions>" +
        "</publishtemplatecontent>";
    
    // 文字列を返す
    return PUBLISH_TEMPLATE_CONTENT;
}

C# の例

public static IPublishTemplate CreateDitaTemplate(
        IObjectStore objStore,
        String ditaHome,            // Example: C:/DITA-OT1.4.2.1 or /tmp/DITA-OT1.4.2.1
        String ditaOutputFolder,    // 例: /Publication
        Boolean copyOnly)           // DITA パブリッシング用に false に設定
{
    // Create instance.
    IPublishTemplate pubTemplate 
            = Factory.PublishTemplate.CreateInstance(objStore);

    // テンプレート・タイトルを設定
    String title = "DITAPublish-" 
                 + DateTime.Now.ToString("yyyyMMdd-HHmmss-fff");
    pubTemplate.Properties["DocumentTitle"] = title;

    // テンプレート・コンテンツのコンテンツ転送エレメントを作成
    String PUBLISH_TEMPLATE_CONTENT 
            = buildTemplateContent(ditaOutputFolder);
    System.Text.ASCIIEncoding encoding 
            = new System.Text.ASCIIEncoding();
    System.IO.Stream inputStream 
            = new MemoryStream(encoding.GetBytes(PUBLISH_TEMPLATE_CONTENT));
    IContentTransfer contentElement 
            = Factory.ContentTransfer.CreateInstance();
    contentElement.SetCaptureSource(inputStream);
    contentElement.RetrievalName = "DitaPublishTemplate.xml";
    contentElement.ContentType = "application/x-filenet-publishtemplate";

    // コンテンツ転送エレメントを追加
    IContentElementList cel = Factory.ContentElement.CreateList();
    cel.Add(contentElement);
    pubTemplate.ContentElements = cel;

    // スタイル・テンプレートを設定 (create-style-template スニペットを呼び出し)
    if (copyOnly == false)
    {
        IPublishStyleTemplate pubStyleTemplate
            = SnippetsAdvancedDocManagement.CreateStyleTemplate(
                    objStore);
        pubTemplate.StyleTemplate = pubStyleTemplate;
    }

    // チェックインおよび保存
    // パブリッシングでは公開テンプレートの現在のメジャー・バージョン
    // のみ取るため、チェックインする必要がある
    pubTemplate.Checkin(AutoClassify.DO_NOT_AUTO_CLASSIFY, 
                        CheckinType.MAJOR_VERSION);
    pubTemplate.Save(RefreshMode.REFRESH);
    Debug.WriteLine("Publish template created: " 
                    + pubTemplate.Id);
    return pubTemplate;     
}

// テンプレートのコンテンツを作成
private static String buildTemplateContent(
        String ditaOutputFolder)    // 例: /Publication
{
    String VALUE_ISSOURCEDEPENDENT = "true";

    // テンプレートのコンテンツを公開
    String PUBLISH_TEMPLATE_CONTENT =
        "<?xml version=¥"1.0¥" ?>" +
        "<publishtemplatecontent>" +
            "<version>2.0.1</version>" +
            "<newinstructions>" +
                "<issourcedependent>" + VALUE_ISSOURCEDEPENDENT + "</issourcedependent>" +
                "<outputfoldername>" + ditaOutputFolder + "</outputfoldername>" +
                "<applyproperties>" +
                    "<classdescriptionname>Document</classdescriptionname>" +
                    "<properties>" +
                        "<property>" +
                            "<name>DocumentTitle</name>" +
                            "<value>MyNewDITAPubTitle</value>" +
                        "</property>" +
                    "</properties>" +
                "</applyproperties>" +
                "<applysecurity>" +
                    "<from>default</from>" + // クラス定義からセキュリティーを適用する
                "</applysecurity>" +
            "</newinstructions>" +
            "<republishinstructions>" +
                "<versionablerepublishtype>versionandkeep</versionablerepublishtype>" +
                "<nonversionablerepublishtype>addandkeep</nonversionablerepublishtype>" +
                "<applypropertiesfrom>destination</applypropertiesfrom>" +
                "<applysecurityfrom>destination</applysecurityfrom>" +
            "</republishinstructions>" +
        "</publishtemplatecontent>";

    // 文字列を返す
    return PUBLISH_TEMPLATE_CONTENT;
}

DITA プロジェクトのパブリッシング

前の例で示したメソッドを呼び出して DITA Rendition Engine 接続と DITA パブリッシュ・テンプレートを作成し、DITA ドキュメントをパブリッシュするコード例を以下に示します。(パブリッシュ・テンプレート・メソッドでは、copy-only パラメーターの値が false の場合、パブリッシュ・スタイル・テンプレートも作成します。) この例では、パブリッシュの <publicationname> オプションを使用して、パブリッシュされるドキュメントのタイトルを設定します。他のパブリッシュ・オプションでは、パブリッシュ・テンプレートに設定されているオプションを上書きできます。詳細については、パブリッシュ・オプションの XML を参照してください。

注:
  • DITA プロジェクトをパブリッシュしようとする前に、すべての DITA 分類子操作を完了しておく必要があります。
  • ドキュメントのパブリッシュ要求は、非同期で処理されます。

Java の例

public static void publishDitaDocument(
        ObjectStore objStore,
        Document sourceDitaDoc, 
        String ditaHome,            // Example: C:/DITA-OT1.4.2.1 or /tmp/DITA-OT1.4.2.1
        String ditaWorkingDir,      // Example: C:/Temp or /tmp
        String ditaOutputFolder,    // 例: /Publication
        boolean copyOnly)           // Set to true if publishing = copying.
        throws Exception
{
    // Show parameters.
    System.out.println("Parameter copyOnly: " + copyOnly);
    System.out.println("");
    
    // パブリッシング構成に DITA エンジン接続があることを確認
    // (calls create-DITA-Connection snippet).
    SnippetsAdvancedDocManagement.createDitaConnection(
            objStore.get_Domain(), ditaHome, ditaWorkingDir);
    
    // パブリッシュ・テンプレートを取得 (create-template コードを呼び出し)
    PublishTemplate pubTemplate 
        = SnippetsAdvancedDocManagement.createTemplate(
                objStore, ditaHome, ditaOutputFolder, copyOnly);
    
    // パブリッシュ・オプションを作成
    SimpleDateFormat timeStamp = new SimpleDateFormat("yyyyMMdd-HHmmss-SSS");
    String title = "DITAdocument-" + timeStamp.format(new Date());
    String pubOptions = new String(
            "<publishoptions><publicationname>"
            + title 
            + "</publicationname></publishoptions>");

    // ドキュメントをパブリッシュ
    PublishRequest pubRequest 
            = sourceDitaDoc.publish(pubTemplate, pubOptions);
    pubRequest.save(RefreshMode.REFRESH);
    System.out.println("Submitted request to publish document with title '" 
                        + title + "'");
    
}

C# の例

public static void PublishDitaDocument(
        IObjectStore objStore,
        IDocument sourceDitaDoc,    
        String ditaHome,            // Example: C:/DITA-OT1.4.2.1 or /tmp/DITA-OT1.4.2.1
        String ditaWorkingDir,      // Example: C:/Temp or /tmp
        String ditaOutputFolder,    // 例: /Publication
        Boolean copyOnly)           // publishing = copying の場合、true に設定
{
    // Show parameters.
    Debug.WriteLine("Parameter copyOnly: " + copyOnly);
    Debug.WriteLine("");
    
    // パブリッシング構成に DITA エンジン接続があることを確認
    // (calls create-DITA-Connection snippet).
    SnippetsAdvancedDocManagement.CreateDitaConnection(
            objStore.Domain, ditaHome, ditaWorkingDir);

    // パブリッシュ・テンプレートを取得 (create-template コードを呼び出し)
    IPublishTemplate pubTemplate 
            = SnippetsAdvancedDocManagement.CreateTemplate(
                    objStore, ditaHome, ditaOutputFolder, copyOnly);

    // パブリッシュ・オプションを作成
    String title = "DITADocument="
                 + DateTime.Now.ToString("yyyyMMdd-HHmmss-fff");
    String pubOptions = 
            "<publishoptions><publicationname>"
            + title
            + "</publicationname></publishoptions>";

    // ドキュメントをパブリッシュ
    IPublishRequest pubRequest 
            = sourceDitaDoc.Publish(pubTemplate, pubOptions);
    pubRequest.Save(RefreshMode.REFRESH);
    Debug.WriteLine("Submitted request to publish " +
                    "document with title '" + title + "'");

}


最終更新日: 2015 年 10 月
dita_procedures.htm

© Copyright IBM Corp. 2015.