QRコード作成をWicket で!

Google Chart API QRコード作成を Wicket の自作コンポーネントを書いてみた。
(ただし、Wicket1.4 用)

WebComponent を継承し対象データは Model で受け取り、画像作成のための
パラメータもコンストラクタの引数にする。

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebComponent;
import org.apache.wicket.model.IModel;
/**
 * QrImage
 *
 * QrImage(String id,IModel<String> model,int size,String type,String encode)
 * model : データ文字列
 * size  : 幅、高さのサイズ pix
 * type  : 画像種類  "gif" "png" "jpg" "bitmap" のいずれか
 * encode: 出力文字コード
 */

public class QrImage extends WebComponent{
   IModel<String> model;
   int size;
   String type;
   String encode;

   public QrImage(String id,IModel<String> model,int size,String type,String encode){
      super(id);
      this.model = model;
      this.size = size;
      this.type = type;
      this.encode = encode;
   }

   @Override
   protected void onBeforeRender(){
      super.onBeforeRender();
      if (this.model.getObject() != null && this.model.getObject().length() > 0){
         try{
         String chs = Integer.toString(this.size);
         add(new SimpleAttributeModifier("width",chs));
         add(new SimpleAttributeModifier("height",chs));
         StringBuilder sb = new StringBuilder();
         sb.append("http://chart.apis.google.com/chart?cht=qr&chs=");
         sb.append(chs+"x"+chs);
         sb.append("&choe=");
         sb.append(this.encode);
         sb.append("&chof=");
         sb.append(this.type);
         sb.append("&chl=");
         sb.append(URLEncoder.encode(this.model.getObject(),"UTF-8").replaceAll("\r\n","%0D%0A"));
         add(new SimpleAttributeModifier("src",sb.toString()));
         }catch(UnsupportedEncodingException e){
            throw new RuntimeException(e);
         }
      }
   }

}

サンプル、
HTMLはこのように img タグを書く
改行も試すために TextArea を使う


<form wicket:id="form">
<textarea wicket:id="text" rows="8" cols="40"></textarea></td>
<input type="submit" value="作成"/>
</form>
<div><img wicket:id="qrcode"/></div>

このHTMLのページクラスで、QrImage を生成

public class QrMakeSamplePage extends WebPage{
   private String inputText;
   public QrMakeSamplePage(){
      add(new QrImage("qrcode",new PropertyModel<String>(this,"inputText"),120,"gif","Shift_JIS"));
      final TextArea<String> text = new TextArea<String>("text",new Model<String>());
      Form<Void> form = new Form<Void>("form"){
         @Override
         protected void onSubmit(){
            setInputText(text.getModelObject());
         }
      };
      form.add(text);
      add(form);
   }
   protected void setInputText(String inputText){
      this.inputText = inputText;
   }
}

Wicket 1.5 では、これではダメなのだが。