i2i無料WEBパーツ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
遅くなりましたが、Seasar Conference 2008 Springのストリーミング配信の感想。

やはり、ストリーミングだと顔まではわかりませんでしたねぇ・・・残念(・_・:)

ustream2.jpg


ストリーミングってあのくらいの解像度しか出ないのかなぁ・・・Yahooのプロ野球の中継くらいの画素数で見たかったww

まあ、雰囲気は味わえたのでよかったかな。
秋にもありそうなんで、次回は参加してたいですな。

全般的にサクサク感がよくつたわるセッションが多かったですね。

「StrutsからSAStrutsへ」は、パワーポイントでの遊び心が満載で笑っちゃいました。
「救世主」ですか・・・ww

Urumaのセッションは、ちょっと前置きの説明が長かったかったような・・・w。もうちょっと、デモを見たかったかな。でも、Urumaの魅力は十分に伝わる内容でした。

スポンサーサイト
Seasar Conference 2008 Spring が今週末に市ヶ谷で行われまね。
気づいたときは定員達していましたので残念に思っていたのですが、
ストリーミング配信してくれるそうです。

こういうのは、非常にうれしいですね!これは、見なけりゃな・・・。
JFluteさんも見られるようですし楽しみ・・・w

以下、メーリングリストでのお知らせです。

-----------------------------
来る5/24(土)、Seasar Conference 2008 Springが開催されますが、
当日はセッション会場からUstream.TVによるライブストリーミング
配信を予定しております。当日、現地に参加できない皆様も是非ス
トリーミング配信でセッションをお楽しみ下さい。

なお、当日のネットワーク状況や不慮のトラブルなどにより、正常に
視聴できない場合もある点、ご理解の程よろしくお願い致します。

詳細は、下記イベントサイトをご覧ください。

http://event.seasarfoundation.org/sc2008spring/Streaming

teedaでエラーメッセージをtitleに設定するコードを以前の載せましたが、AOPによる実装を試してみました。
Pageクラスでは、get+id+Titleのダイナミックプロパティのメソッドを設定しておけば、SetErrorToTitleInterceptor.javaが、エラーがあった場合にtitle属性にエラーメッセージを設定してくれます。

この実装がベストとはとても思えませんが、まあ、とりあえずはこんな感じで・・・。本当は、アノテーション設定するだけtitle属性に設定できるようにしたいんですけどね。。。まあ、おいおいかしら・・。
どうもDI+AOPってのにこなれてないんだよねぇ。

◆customizer.dicon


◆SetErrorToTitleInterceptor.java
package example1.interceptor;

import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * titleを設定するDynamicPropertyに対して、エラーメッセージを設定します。
 * @author jasonkidd
 */
public class SetErrorToTitleInterceptor implements MethodInterceptor {

	public Object invoke(final MethodInvocation invocation) throws Throwable {
		    final Method method = invocation.getMethod();

		    // パターンによりIDを取得
		    Pattern pattern = Pattern.compile("get(.+)Title");
		    Matcher matcher = pattern.matcher(method.getName());  
		    String targetName = "";
		    if(matcher.find()) {
		    	targetName = matcher.group(1);
		    	//先頭の文字だけ小文字にする
			    targetName = targetName.substring(0, 1).toLowerCase() + targetName.substring(1);
		    }
			//エラーメッセージを取得してtitleに設定する。 
			Iterator it = FacesContext.getCurrentInstance().getMessages("layoutChildBody:form:" + targetName); 
			String message = ""; 
			if (it.hasNext()) { 
				message = it.next().getDetail(); 
			}
		    return message;
		  }

}

◆NewuserPage.java
package example1.web.hello;

/**
 * ユーザー登録ページ
 * @author jasonkidd
 */
public class NewuserPage extends AbstractNewuser {

	@ByteLength(maximum = 255)
	@Required
	public String name;
	@Required
	@ByteLength(maximum = 10)
	@Exist
	public String loginId;
	@Required
	@ByteLength(maximum = 10)
	public String password;

	@Required
	@ByteLength(maximum = 10)
	@Equal(targetId="password")
	public String passwordCert;

	/** アップロードファイル **/
	public UploadedFile uploadedFile;

	 private Long fileSize;

	private String wrotePath;
    
	private HttpServletRequest request;

	/**
	 * エラー発生時にSetErrorToTitleInterceptorでエラーメッセージを設定する為のメソッド。 
	 * @return
	 */
	public String getNameTitle(){	return null;	}
	public String getLoginIdTitle(){	return null; 	}
	public String getPasswordTitle(){	return null; 	}
	public String getPasswordCertTitle(){	return null; 	}
//・・・以下略
teedaでファイルのアップロードとサムネイルの作成を実装したので、メモ。下記の2つのHPに情報がのっていました。ほぼ、流用させていただきました。

◆Teedaファイルアップロード
Teedaでファイルアップロード機能を実装するには

◆サムネイル作成
侍ズム | Samuraism Javaでサムネイル作成

◆UploadPagejava
以下は、アップロードのページクラスのメソッドの抜粋です。ファイルの書き込みとサムネイルの作成をして、imgタグのDynamicPropatyで作成されたファイルの参照を出力しています。

public UploadFile uploadFile
public String fileName;
public String wrotePath;

public String doUpload() {
    // アップロードされたファイル名を取得
    fileName = uploadedFile.getName();
    // アップロードされたファイルのサイズを取得
    fileSize = uploadedFile.getSize();
    FileOutputStream fos = null;
    ImageInputStream iis = null;
    try {
        // アップロードされたファイルを取得するための入力ストリームを取得
        InputStream is = uploadedFile.getInputStream();

        // テンポラリフォルダにアップロードファイルを保存
        String tmpdir = application.getRealPath(IMAGE_PATH);
        System.out.println("tmpdir:"+ tmpdir);

        //実際にアプリから参照できるフォルダに配置
        fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
        File outputFile = new File(tmpdir, "//" + fileName);
        fos = new FileOutputStream(outputFile);

        int b;
        while ((b = is.read()) >= 0) {
            fos.write(b);
        }

        wrotePath = outputFile.toString();

        //一度クローズ処理を実施
        fos.close();
        fos = null;
       	
        createThumbnail(tmpdir, fileName);

        return null;
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    finally
    {
       	if(fos != null){
            try {
                fos.close();
            } catch (IOException e) {
	        e.printStackTrace();
	    }
    	}
        if(iis != null){
           try {
               iis.close();
	   } catch (IOException e) {
	       e.printStackTrace();
	   }
        }
    }
}

/**
 * サムネイルの作成
 */
private void createThumbnail(String tmpdir, String outputFileName) throws IOException {
    //サムネイルの作成
    int width = 90;
    int height = 120;
    String inputFullPath = tmpdir + "\\" + outputFileName;
    String outputFullPath = tmpdir + "\\" + "tn_" + outputFileName;
    File inputFile = new File(inputFullPath);
    try {
        ImageUtil.getThumbnail(inputFile, width, height, outputFullPath);
    } catch (IOException e) {
	throw e;
    } catch (Exception e) {
	e.printStackTrace();
    }
}

@Binding(bindingType = BindingType.NONE)
public void setUploadedFile(UploadedFile uploadedFile) {
    this.uploadedFile = uploadedFile;
}
/**
 * アップロードしたファイルのパスをsrcプロパティに返します。(DynamicProperty)
 * @return the imgPath
 */
public String getImgPathSrc() {
    return "../../data/" + fileName;
}
/**
  * アップロードしたファイルのサムネイルのパスをsrcプロパティに返します。(DynamicProperty)
  * @return the imgPath
  */
public String getTnImgPathSrc() {
    return "../../data/tn_" + fileName;
}

◆ImageUtil.java
サムネイルを作成するクラスです。
public class ImageUtil {

    public static void getThumbnail(File file , int width ,int height, String outputFullPath) throws Exception {
	
	FileInputStream fis = new FileInputStream(file);
	BufferedImage image = ImageIO.read(fis);
	
        ImageInputStream iis = ImageIO.createImageInputStream(fis);
        Iterator readers = ImageIO.getImageReaders(iis);
	BufferedImage shrinkImage = new BufferedImage(width, height, image.getType());

        try {
	    //ファイルフォーマットの取得
	    ImageReader reader = readers.next();
	    String ext = reader.getFormatName();
	    Graphics2D g2d = shrinkImage.createGraphics();
	    g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
			RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
	    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
			RenderingHints.VALUE_ANTIALIAS_ON);
	    g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,
			RenderingHints.VALUE_COLOR_RENDER_QUALITY);
	    g2d.setRenderingHint(RenderingHints.KEY_DITHERING,
			RenderingHints.VALUE_DITHER_ENABLE);
	    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
			RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
	    g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
			RenderingHints.VALUE_RENDER_QUALITY);
	    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
	    		RenderingHints.VALUE_INTERPOLATION_BILINEAR);
	    g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
	    		RenderingHints.VALUE_FRACTIONALMETRICS_ON);
	    g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
	    		RenderingHints.VALUE_STROKE_NORMALIZE);
	    g2d.drawImage(image, 0, 0, width, height, null);
	    ImageIO.write(shrinkImage, ext, new File(outputFullPath));
	} catch (Exception e) {
            e.printStackTrace();
	} finally {
	    if( shrinkImage != null ){
		shrinkImage = null;
	    }
	    if( iis != null ){
		iis.close();
	    }
	    if( fis != null ) {
		fis.close();
	    }
	}
}

◆アップロード前の画面
upload.gif

◆アップロード完了
upload_result.gif

◆Tomcatの設定
ファイルアップロードでは下記のようにTomcatの設定しないとOutOfMemoryが発生しました。この辺の設定は気が付かなかったりするので要注意ですなぁ・・・。
tomcat_jvm_setup.gif

◆エラー
Tomcatの設定をEclipseでしとかないと、こんな感じでエラーがでますね。

java.lang.OutOfMemoryError: PermGen space
    at sun.java2d.SunGraphicsEnvironment.(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(Unknown Source)
    at java.awt.image.BufferedImage.createGraphics(Unknown Source)
    at example1.util.ImageUtil.getThumbnail(ImageUtil.java:34)
    at example1.web.hello.UploadPage.createThumbnail(UploadPage.java:143)
teedaのエラーをいい感じで表示したいってことで色々しらべて実装してみました。

koichik様、ご指導いただきありがとうございます。

まず、どのような表示にしたいのかということで、下記のサイトでtooltipTextってjavascriptが紹介されてましたのでそれで行こうかなって事にしました。

Gigazine

出力としてはこんな感じのやつです
サンプルイメージ


◆tooltipTextの配置
ソースは下記のサイトからダウンロードできます。
dhtmlgoodies.com
Download scriptのYou can download the entire script from this Zip fileってところからスクリプトをダウンロードします。
必要はファイルは下記の5つです。

ダウンロードしたファイルは下記のようにプロジェクトに配置しました。この配置が正しいかは激しく怪しいですが・・・
ファイル配置
tooltipTextの使い方は下記のようにテキストの属性に、tooletipTextってのを追加してエラーメッセージなんかを記述しておくと、onclick時にその内容が吹き出しで表示されるって寸法です。



これをteedaで使ってみようと思ったのですが、問題が・・・。

TeedaのDynamicPropertyだとオリジナルな属性の置換が出来ないっぽい・・・・。

実装がわるいのかどうかわかりませんが、getNameTooltipText()というメソッドを作成したのですが、出力がうまくいかなかったです。
ちなみに、tooltipText="#{hello_registPage.nameTooltipText}"とレンダリングされました。

そんな訳で、javascript側を改造してtitle属性から値を取得して吹き出しに出力するようにしました(汗。
ライセンスについて一応調べましたが問題なさそうなので↓。

LGPLについて
  LGPLでは、ライセンスの継承を必要とせず、それを利用して作成されたプログラムのソースコードを公開することは強制されないが、公開されたソースコードを改変して利用した場合には、その部分のソースコードは公開しなければならないとされている。

ということなので、改変した部分はコメントを記述してます。
以下、修正したjavascriptとオリジナルです。
rounded-corners.js(オリジナル)
form-field-tooltip.js(オリジナル)
form-field-tooltip-kj.js(teeda用に修正)


あと、吹き出しの引出し部分のgifを透過にして、吹き出し本体と同色で表示するように修正しました。green-arrow-right-clear.gif

ただし、背景色を白にしているので背景色が白以外のページで使用するのはちょっとカッコ悪いです。いずれにしてページに合わせてgifを修正して使用しなきゃなさそうですね。

◆出力結果
簡単な登録画面でテストしましたが、下記のようにonmouseでエラー内容がtitleで表示されます。
オンマウス時


オンクリック時には、下記のように吹き出しでエラー内容を表示できます。テキストボックスの上に表示しているのはteedaでなんの小細工もしなかったときのエラーメッセージです。
エラー発生時

◆regist.html
以下は登録画面のhtmlです。tooltipTextを使うために<HEAD>タグ内でcssとjavascriptを呼んでます。 あと、<body>タグのしたの方に、初期化処理があります。その他は特に変わった修正は必要ないです。いたって簡単ですわ。ただ、エラーを表示させるために、<INPUT>タグにtitle属性を設定しています。

◆layout.html
以下はレイアウトhtmlです。一応のせときます。
onTeedaErrorでエラーが発生したテキストボックスのbgcolorが指定してあります。どっかのサンプルどおりですな・・・へへh。


◆RegistPage.java
以下、ページのソースです。getNameTitle()メソッドがDyamicPropertyで、id="name"のテキストボックスにエラーがある場合には、title属性にそのエラー内容を出力しています。
この実装だと、メソッドごとに同じような記述が必要なのでありえないですよね・・・まあ、とりあえず練習がてらということで、許してくださいな・・・(汗

下記のようにレイアウトを使っている場合はlayoutChildBodyの記述が必要でございますな。
FacesContext.getCurrentInstance().getMessages("layoutChildBody:Form:name");

このあたりは、AbstaractPageクラスやらアノテーションやらで素敵な実装が出来るような気がするのだが、現在検討中でふ。

◆TODO
基本的な動作は確認できたので、次は下記の項目について調査して実装かな・・・そもそもS2についての基礎知識が疎かなのでその辺も勉強しながらですなぁ。

・アノテーションを使ってtitle属性へ、エラーメッセージを設定するようにする。(出来るかどうかしらんけど・・・(汗)  とりあえずS2AOPの概要で勉強してみるかねぇ・・・
>>次のページ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。