[{PageViewPlugin}]
[GeoPicPlugin]

!!!Abstract
以下にGeoPicPlugin開発時のお恥ずかしい苦労話などを記録します。

!!!Topic
!!やりたいこと:
*フォームに入っているテキストをもとにページを作成し、ファイルを添付する。
*JSPWikiのライブラリを最大限活用
*web.xmlはいじりたくない。つまりできるだけJSPWikiから独立に開発を進めたい。
*Tomcat8.5でも動かしたい。(コンテンツ分けるか)

!!記録
*JSP or Servlet
|やりたいことをやるには、JSPかServletか
|HttpServletRequestでフォームの情報は引き出せそう。JSPからは使える?サーブレットから渡してやる感じか。つまり少なくともサーブレットは作らないとか。
|Pluginの中にサーブレットクラスって入れられる?JSPWIKIでの例はなさそうなので、やってみるしかないか。→[1]の方法でできた!割と簡単。WEB.XML編集しなくてもできるんだ。Servlet3.0, [Tomcat]8から対応とのこと。

*つぎは、Formの使い方か
|[2]を参照して実施。
|FormタグでAction属性に、動かしたいURLを指定
|Formタグで囲われた中にInput type="Submit"を。
|Buttonは、TypeもButtonとしておかないと、Type=submitと同じ動きをする。
|Formにenctype="multipart/form-data" を設定する必要がある。

*GetとPostの違いを確認
|Getは主にサーバからクライアントが情報を取るとき。
|Postは、サーバに情報をアップデートするとき。

*ServletのなかでWikiEngine呼び出せるかな。
|AttacheServletが参考になる。最初に必ず
{{{
org.apache.wiki.InternalWikiException: No wiki engine, check logs.
	org.apache.wiki.WikiEngine.getInstance(WikiEngine.java:377)
	org.apache.wiki.WikiEngine.getInstance(WikiEngine.java:316)
	org.braincopy.jspwiki.plugin.TestServlet.init(TestServlet.java:28)
}}}
|これは、WikiEngine.getInstance()をやるときにWeb.xmlを見に行こうとするから一回目は出るらしい。

|JSPWikiのUpload.jspをみると、JSP側でもWikiEngine.getInstance()を呼び出している。このあたりの違いか。要確認。
|JSP側の処理で上記以外もある。PluginからcontextをServletに渡すことは可能か?
|Access権関係なんかあるのかな。
|どうも新しいページを作れない。
|WikiEngineオブジェクトがおかしいのか。saveTextが使われるはず。→ん?呼ばれない?Contextがページと結びついているはず。SaveTextが呼ばれた瞬間にPageは作られているか?
|AttacheServletにディスパッチしてForwardしよう!
|もうJSPからつくるつもりにならないとだめか。。。
|まずは、WikiEngineがちゃんと作られていないというエラーを対処する方向で。
{{{
org.apache.wiki.WikiEngine@1d6c9a6
./temp/personal: org.apache.wiki.WikiEngine@1d6c9a6
org.apache.wiki.WikiEngine@1bf1ec2
org.apache.wiki.WikiEngine@1bf1ec2
}}}
|新しいWikiEngineが作られている。自然ではない。
|ServletContextの中にWikiEngineが保存されていない?
|AttacheServletのInitから呼ばれているgetInstanceでは、そこは保存されているようで、
{{{
        WikiEngine engine = (WikiEngine) context.getAttribute( ATTR_WIKIENGINE );
}}}
|でえられていた。
|でもgetInstance()の中で、setAttributeもやっている。どういうことだ。
|参照しているServletContextが違うオブジェクト?
{{{
org.apache.catalina.core.ApplicationContextFacade@12bc773
org.apache.catalina.core.ApplicationContextFacade@1c81301
}}}
|うーん、違う。このContextの中だと保存されていない。。。gpuploadがPersonalの配下にいない。。。
|form でactionを指定するときに"/gpupload"だとhostname/gpuploadになってしまう。actionを"gpupload"にすると狙い通りhostname/appname/gpuploadになる。これでWikiEngineは、ちゃんと作れるようになった。

*さて、あとは新しいページをどう作るかだ。
|WikiPageオブジェクトをnewで作ればいいだけだった。。。

*さて、フォワードしよう。どうするかな。
|フォワードしたさきの
{{{
upload.parseRequest( req );
}}}
|でうまくITEMが取れていない。一回とっちゃうとダメなんじゃ。うん、2回parseRequestはできないっぽい。
|選択肢は、AttacheServletの内容をコピーする。でもあまりやりたくない。AttacheServletを継承できるかな。→AttacheServletを継承し、privateで見えないメンバ変数とメソッドを再度定義しつつ、uploadメソッドをオーバーライド。
!!記録2(Tomcat8.5対応)
*まずは何が動いていないか確認したい。
*/gpuploadが呼び出されたら何が動くのか?init()かupload()だろうね。
|やばい。自分で緯度経度を指定する場合、普通に動いた。EXIFを使う場合だけ、へんなエラーが出るのかもしれない。
|executeUpload(context, in, filename, nextPage, wikipage, changeNote, fileSize);で何か起きてる。
|実はUseEXIF関係ない。ファイルサイズ制限のエラー処理ができていない。たぶん今設定で4Mまでにしているところ8Mをアップしようとしたから落ちたのだろう。エラーメッセージがおかしいのも問題だが、やはり適切なサイズでアップするようなプログラムにしたい。
|executeUpload()のオーバライドに挑戦。もはやAttachmentServletを継承している意味がなくなりつつあるが。その中でAttacheManager.validateFileName()がis not visibleとでる。AttachmentManagerはpublicクラスだし、validateFileName()はstaticメソッドだし、見れないはずないのだが。コンパイルも通るし。なんでだろう。staticメソッドはpublic指定されていないと使えない。何も書かないとprotectedよりきつい[3]。ということで権限のないメソッドはコピーしてくる。
|相変わらず、ファイルサイズ制御のエラーは、ちゃんとエラー処理できていない。org.apache.commons.fileupload.FileUploadBase$FileSizeLimitExceededExceptionをちゃんと受け止め切れていない。[まあ、その前にファイルサイズを落とすことを考えよう|Resize image file w GeoPicPlugin]。


!!!Reference
#[#1][http://www.javaroad.jp/servletjsp/sj_servlet14.htm]
#[#2][http://www.tagindex.com/html_tag/form/input_submit.html]
#[#3][https://www.sejuku.net/blog/22679]