GeoPicPlugin
Abstract#
以下にGeoPicPlugin開発時のお恥ずかしい苦労話などを記録します。
Topic#
やりたいこと:#
- フォームに入っているテキストをもとにページを作成し、ファイルを添付する。
- JSPWikiのライブラリを最大限活用
- web.xmlはいじりたくない。つまりできるだけJSPWikiから独立に開発を進めたい。
- Tomcat8.5でも動かしたい。(コンテンツ分けるか)
| やりたいことをやるには、JSPかServletか | 
| HttpServletRequestでフォームの情報は引き出せそう。JSPからは使える?サーブレットから渡してやる感じか。つまり少なくともサーブレットは作らないとか。 | 
| Pluginの中にサーブレットクラスって入れられる?JSPWIKIでの例はなさそうなので、やってみるしかないか。→の方法でできた!割と簡単。WEB.XML編集しなくてもできるんだ。Servlet3.0, Tomcat8から対応とのこと。 | 
| を参照して実施。 | 
| FormタグでAction属性に、動かしたいURLを指定 | 
| Formタグで囲われた中にInput type="Submit"を。 | 
| Buttonは、TypeもButtonとしておかないと、Type=submitと同じ動きをする。 | 
| Formにenctype="multipart/form-data" を設定する必要がある。 | 
| 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よりきつい。ということで権限のないメソッドはコピーしてくる。 | 
| 相変わらず、ファイルサイズ制御のエラーは、ちゃんとエラー処理できていない。org.apache.commons.fileupload.FileUploadBase$FileSizeLimitExceededExceptionをちゃんと受け止め切れていない。まあ、その前にファイルサイズを落とすことを考えよう。 | 
Reference#
- http://www.javaroad.jp/servletjsp/sj_servlet14.htm  
- http://www.tagindex.com/html_tag/form/input_submit.html  
- https://www.sejuku.net/blog/22679