class属性に値を上書きせずに追加するBehaviorを作った

WicketでHTML要素の属性を変更するには、AttributeModifierかSimpleAttributeModifierを使います。
しかしながら以下のようなHTML要素のクラス属性に関してはそのまま変更しては問題があります。

<p wicket:id="hello" class="body description">ここが変わります。</p>
new Label("hello", "こんにちは").add(new SimpleAttributeModifier("class", "message"));


この場合表示されるHTMLは以下のようになります。

<p class="message">こんにちは</p>


他の属性と違いclass属性の場合、元の値に加えて新しい値を追加したいという場面はかなり多いのではないでしょうか。
Javadocsを見た感じでは、こういう用途に特化したクラスはありませんでした。



【追記】AttributeAppenderというクラスがあるそうで、このクラスを使えば上記の処理が実現できます。

new Label("hello", "こんにちは").add(new AttributeAppender("class", new Model("message"), " "));



SimpleAttributeModifierの場合は以下のようにonComponentTagをオーバーライドしてやることで、値を上書きせずに追加させることが出来ます。

new Label("hello", "こんにちは").add(new SimpleAttributeModifier("class", "message"){
	@Override
	public void onComponentTag(Component component, ComponentTag tag) {
		tag.put(getAttribute(), tag.getString(getAttribute()) + " " + getValue());
	}
});

ただ毎回オーバーライドするのも面倒なので、AbstractBehaviorクラスを継承したclass属性の値の追加に特化したクラスを今回は書いてみました。

public class AddClassAttributeModifier extends AbstractBehavior{
	private static final long serialVersionUID = 1L;
	
	private String value;
	
	public AddClassAttributeModifier(String value){
		this.value = value;
	}
	@Override
	public void onComponentTag(Component component, ComponentTag tag) {
		tag.put("class", tag.getString("class") + " " + value);
	}
}

以下のように使うとclass属性に値を追加できます。

new Label("hello", "こんにちは").add(new  AddClassAttributeModifier("message"));


この記事を書いていて思ったのですが、style属性とかでも使う気がするので、どの属性を変更するか指定できたほうがいいかもしれません。