Apache Cocoon 2.2に導入されたblockの概念を理解するために、以下のCocoonのサイトに解説されているgetting-stated-appを導入してみる。
http://cocoon.apache.org/2.2/1159_1_1.html
ところが自分でコードを入れていっても、どうも色々とハングしてうまいこと行かない。
そこでコードごと、以下のgithubから拝借して、最終のCocoon web applicationを一気に導入してみることとした。
https://github.com/kdridi/getting-started-app
getting-started-app-master.zipをダウンロードして、展開したフォルダーgetting-started-appをapache-maven-3.3.9のフォルダに置く。
JSONのシリアライザだけは導入したいので、saxonを導入するために以下の変更を加えることとした。
まずmyBlock1のフォルダにあるpom.xmlに、
1 2 3 4 5 |
<dependency> <groupId>net.sf.saxon</groupId> <artifactId>saxon</artifactId> <version>8.7</version> </dependency> |
を追記する。
次に、http://mrhaki.blogspot.jp/2008/09/use-saxon-in-cocoon-22.html
を参考に、myBlock1/src/main/resources/META-INF/cocoon/にavalonフォルダを設けて、
cocoon-core-xslt-saxon.xconf
sitemap-transformers-saxon-transformer.xconf
の2つを置く。
最後にmyBlock1/src/main/resources/COB-INF/sitemap.xmapに以下の変更を加える。
1 2 3 |
<map:sitemap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://apache.org/cocoon/sitemap/1.0 http://cocoon.apache.org/schema/sitemap/cocoon-sitemap-1.0.xsd" xmlns:map="http://apache.org/cocoon/sitemap/1.0" xmlns:json="http://json.org/"> |
また同ファイルのmatcher パイプラインに、
1 2 3 4 5 6 7 8 9 10 |
<map:match pattern="myThirdPipeline"> <map:generate src="myXmlFile.xml" type="file"/> <map:transform src="xml-to-json.xsl" type="saxon"/> <map:serialize type="text"/> </map:match> <map:match pattern="myForthPipeline"> <map:generate src="2013_8_24.xml" type="file"/> <map:transform src="xml-to-json.xsl" type="saxon"/> <map:serialize type="text"/> </map:match> |
を追記して、
以下のxml-to.json.xslファイルをCOB-INFに置く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?xml version="1.0" encoding="UTF-8"?> <!-- Author: Robby Pelssers This stylesheet offers functions to easily generate JSON from JSON-XML The stylesheet also offers the possibility to wrap the JSON in a callback function which is often used with JSONP --> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:js="http://www.ciber.com/json-xml"> <xsl:param name="callback" select="''" as="xs:string"/> <xsl:variable name="quote" select="'"'"/> <xsl:template match="/"> <xsl:choose> <xsl:when test="$callback != ''"> <xsl:value-of select="concat($callback, '(')"/> <xsl:apply-templates/> <xsl:value-of select="');'"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:function name="js:handleElement" as="xs:string"> <xsl:param name="element" as="element()"/> <xsl:param name="format" as="xs:string?"/> <xsl:apply-templates select="$element" > <xsl:with-param name="format" select="$format"/> </xsl:apply-templates> </xsl:function> <xsl:function name="js:handleProperties" as="xs:string"> <xsl:param name="properties" as="element(js:p)*"/> <xsl:value-of select="string-join(for $property in $properties return js:handleElement($property, ''), ',')"/> </xsl:function> <xsl:template match="js:a" as="xs:string"> <xsl:value-of select="concat('[', string-join(for $element in ./js:* return js:handleElement($element, @js:format), ','), ']')"/> </xsl:template> <xsl:template match="js:o" as="xs:string"> <xsl:value-of select="concat('{', js:handleProperties(js:p), '}')"/> </xsl:template> <xsl:template match="js:string" as="xs:string"> <xsl:value-of select="concat('"', replace(text(), '"', '\\"' ), '"')"/> </xsl:template> <xsl:template match="js:integer | js:double | js:long | js:short | js:float | js:byte" as="xs:string"> <xsl:param name="format"/> <xsl:value-of select="if (not($format)) then text() else format-number(text(), $format)"/> </xsl:template> <xsl:template match="js:dateTime" as="xs:string"> <xsl:param name="format"/> <xsl:value-of select="if (not($format)) then text() else format-dateTime(text(), $format)"/> </xsl:template> <xsl:template match="js:date" as="xs:string"> <xsl:param name="format"/> <xsl:value-of select="if (not($format)) then text() else format-date(text(), $format)"/> </xsl:template> <xsl:template match="js:p" as="xs:string"> <xsl:value-of select="concat($quote, @js:name, $quote, ': ', js:handleElement(./*, @js:format))"/> </xsl:template> </xsl:stylesheet> |
以上で準備管理。
次に、myBloxk1フォルダで、mvn install実行。
次に、myBlock2フォルダで、mvn install実行
最後に、CocoonWebAppフォルダでmvn install実行
そのままCocoonWebAPpフォルダで、mvn jetty:runで、http://localhost:8888/でOK.
一旦jettyをCntl+Cで終了して、
myCocoonWebApp/target/ファルダにはmyCocoonWeApp-1.0.0.warが作成されているので、このファイルをそのままTomcatのwebsフォルダに置いて、tomcatをスタートすれば、CocoonWebAppが自動的に展開され、Cocoon Web Applicatonがhttp://localhost:8888/CocoonWebAppで動いていることが確認できた。