Struts2のWebアプリからlucene-gosen用の辞書ファイルに単語を追加してビルドしてみる

ここのところ↓のようにlucene-gosenをいじっていますが、
lucene-gosenを試してみる その1
lucene-gosenを試してみる その2
辞書の運用をしていくとなると、ツール化が必要で、且つ、Webベースだったら、、、
なんていう感じが世の常なので、今回はStruts2で以下の実装をしてみようと思います。
 
1. 辞書ファイルにキーワードが追加出来る
2. 辞書がコンパイル出来る
 
 
■ Struts2のインストール
 
自分の周りではSeasar2(SAStruts)かSpringMVCで開発している、という話を良く聞くのですが、
今回はStrtus2にチャレンジしてみたいと思います。
 
Mavenを使ってホゲホゲすればStruts2のブランクプロジェクトが作れそうなので
さっそくやってみます。
↓の The Blank Archetype (struts2-archetype-blank) で、
http://struts.apache.org/2.2.3/docs/struts-2-maven-archetypes.html
↓のようなブランクプロジェクトが作れるみたいです。

  • XML-based configuration, demonstrates including additional config file
  • Example actions
  • Package-level resource bundle
  • XML-based validation
  • Unit-testing
  •  
    さっそくMavenで↓のように叩いてみます。

    C:apache-maven-2.2.1binmvn archetype:generate 
        -B -DgroupId=com.shinodogg 
        -DartifactId=trystrutstwo 
        -DarchetypeGroupId=org.apache.struts 
        -DarchetypeArtifactId=struts2-archetype-blank
    

    ↓のようにツラツラ処理が流れていって、

    C:eclipse-java-indigo-SR1-win32-x86_64workspace>C:apache-maven-2.2.1binmvn archetype:generate
    oupId=org.apache.struts -DarchetypeArtifactId=struts2-archetype-blank
    [INFO] Scanning for projects...
    [INFO] Searching repository for plugin with prefix: 'archetype'.
    [INFO] artifact org.apache.maven.plugins:maven-archetype-plugin: checking for updates from central
    Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-archetype-plugin/2.2/mav
    
    Downloading: http://repo1.maven.org/maven2/org/apache/maven/archetype/maven-archetype/2.2/maven-ar
    
    Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-archetype-plugin/2.2/mav
    
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Maven Default Project
    [INFO]    task-segment: [archetype:generate] (aggregator-style)
    [INFO] ------------------------------------------------------------------------
    [INFO] Preparing archetype:generate
    [INFO] No goals needed for project - skipping
    Downloading: http://repo1.maven.org/maven2/org/apache/maven/archetype/archetype-catalog/2.2/archet
    

    ↓のように無事にBuild Successしたみたいです。

    [INFO] ----------------------------------------------------------------------------
    [INFO] Using following parameters for creating project from Archetype: struts2-archetype-blank:2.2.3
    [INFO] ----------------------------------------------------------------------------
    [INFO] Parameter: groupId, Value: com.shinodogg
    [INFO] Parameter: artifactId, Value: trystrutstwo
    [INFO] Parameter: version, Value: 1.0-SNAPSHOT
    [INFO] Parameter: package, Value: com.shinodogg
    [INFO] Parameter: packageInPathFormat, Value: com/shinodogg
    [INFO] Parameter: version, Value: 1.0-SNAPSHOT
    [INFO] Parameter: package, Value: com.shinodogg
    [INFO] Parameter: groupId, Value: com.shinodogg
    [INFO] Parameter: artifactId, Value: trystrutstwo
    [INFO] project created from Archetype in dir: C:eclipse-java-indigo-SR1-win32-x86_64workspacetrys
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESSFUL
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 49 seconds
    [INFO] Finished at: Wed Feb 15 14:41:55 JST 2012
    [INFO] Final Memory: 22M/191M
    [INFO] ------------------------------------------------------------------------
    

     
    ディレクトリみると、それっぽい感じに出来上がってたので、
    Mavenでコンパイルしようとしたら怒られました。

    C:eclipse-java-indigo-SR1-win32-x86_64workspacetrystrutstwo>C:apache-maven-2.2.1binmvn compile
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [ERROR] FATAL ERROR
    [INFO] ------------------------------------------------------------------------
    [INFO] Error building POM (may not be this project's POM).
    

    pom.xmlの${project.version}を入れなさいって事だったみたいで、
    バージョンは↓のように極小的なバージョンにしておいて、
    <version>0.0.1-SNAPSHOT</version>
    Struts2は↓のように2.3.1.2にしてみました。
    <struts2.version>2.3.1.2</struts2.version>
     
    で、mvn compileすると↓のようにうまくは行ったけど、MS932とかサブい感じになってしまったようで、
    まぁ、後からね、、、と。。

    C:eclipse-java-indigo-SR1-win32-x86_64workspacetrystrutstwo>C:apache-maven-2.2.1binmvn compile
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Struts 2 Blank Webapp
    [INFO]    task-segment: [compile]
    [INFO] ------------------------------------------------------------------------
    [INFO] [resources:resources {execution: default-resources}]
    [WARNING] Using platform encoding (MS932 actually) to copy filtered resources, i.e. build is platform
    [INFO] Copying 5 resources
    [INFO] [compiler:compile {execution: default-compile}]
    [INFO] Nothing to compile - all classes are up to date
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESSFUL
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: < 1 second
    [INFO] Finished at: Wed Feb 15 14:58:48 JST 2012
    [INFO] Final Memory: 12M/217M
    [INFO] ------------------------------------------------------------------------
    

     
    ココから先はコマンドラインよりもEclipseでやりたいなってことで、
    プロジェクトをExisting Maven Projectとしてインポートしてみます。
     
    で、さっそくtestHelloWorldを動かしてみたら、、
    ↓なんかSpringのクラスが見つからないとかいって落ちておりまする。
    #ってかブランクでプロジェクト作ってもSpring使ってる感じなんですね、と。

     
    Maven Dependenciesみると↓ぽいJarファイルはパス通ってそう。
    #ってかJavassist使ってるんですね、と。

     
    が、↓のクラスがどこ探しても見つかりません。。ケースセンシティブなマップ。。
    org.springframework.util.LinkedCaseInsensitiveMap;
    JavaDoc見ると、、『Since: 3.0』だそうです。
    spring-core-2.5.jar じゃ入ってねぇって話ですか。。ってことで、pom.xmlを↓のように 3.1.0.RELEASE にしてやりました。

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>3.1.0.RELEASE</version>
                <scope>test</scope>
            </dependency>
    

     
    もっかいテスト流したら↓無事に緑になりました!

     
     
    ■ Struts2 Webアプリをサーブレットコンテナにデプロイ
     
    TomcatでWebアプリケーションを動かそうと思ったら、
    Run asでサーバーて動かす的なの出てこないし。。
    コンテキスト定義を更新とかやっても。。この辺、どうするのか忘れてしまいました。。
    調べるの面倒だなぁと思ってたら、3.3 Assembling (Creating a WAR)
    見ると、mvn jetty:run で動くぜ、と。

    C:eclipse-java-indigo-SR1-win32-x86_64workspacetrystrutstwo>C:apache-maven-2.2.1binmvn compile
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Struts 2 Blank Webapp
    [INFO]    task-segment: [compile]
    ~略~
    2012-02-15 15:44:28.219::INFO:  Started SelectChannelConnector@0.0.0.0:8080
    [INFO] Started Jetty Server
    [INFO] Starting scanner at interval of 10 seconds.
    

    なんか起動したっぽい。。
     
    ↓画面からもアクセス出来ました。

     
     
    ■ 辞書に追加するキーワード情報の登録
     
    とりあえずソースを見ていくと以下のようになっている予感です。
    ・struts.xmlが大元の設定ファイル
    ・includeされているexample.xmlにActionの定義が入っている。
     このパスにアクセスされたら、このクラス呼んで、どのJSPでレンダリングするとか。
    ・バリデーションはどこで誰が何やってるのかよくわからないけど放っておきますw
     
    ってことで、辞書の末尾に1行追加するActionを作ります。
    XMLの定義は以下のような感じで。

        <action name="AddKeyword" class="com.shinodogg.example.AddKeyword">
          <result>/example/DictionaryCompile.jsp</result>
        </action>
    

     
    全然ちゃんと読んでないですが、Actionのクラスにprivate変数定義してsetter/getter付けておけば、
    Formで飛んできた値を取得できるみたいです。

    private String keyword;
    
    public String getKeyword() {
        return keyword;
    }
    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }
    
    private String cost;
    
    public String getCost() {
        return cost;
    }
    
    public void setCost(String cost) {
        this.cost = cost;
    }
    

    って定義してやってexecuteメソッドの中で↓のようにしたら、

    public String execute() throws Exception {
        System.out.println("keyword: "        + getKeyword());
        System.out.println("cost: "           + getCost());
    

    ↓こんなログが出てきましたよ、と。

    [INFO] Restart completed at Wed Feb 15 16:30:59 JST 2012
    keyword: 1
    cost: 1
    

     
    ってことで、executeメソッドの中にファイル追記機能(非常にイイ加減なの…)

        public String execute() throws Exception {
            System.out.println("keyword: "        + getKeyword());
            System.out.println("cost: "           + getCost());
            System.out.println("partofspeech: "   + getPartofspeech());
            System.out.println("pronunciations: " + getPronunciations());
            try{
                File file = new File(DIC_FILE);
                FileWriter filewriter = new FileWriter(file, true);
    
                String keyword = """ + getKeyword() + """;
                String cost = getCost();
                String partofspeech = getPartofspeech();
                String pronunciations = """ + getPronunciations() + """;
    
                // TODO さすがにひどい…w
                filewriter.write(keyword+","+cost+","+partofspeech+","+"固有名詞,人名,名,*,*,"+keyword+","+pronunciations+","+pronunciations+"n");
    
                filewriter.close();
            }catch(IOException e){
                System.out.println(e);
            }
    
            return SUCCESS;
        }
    

     
    でもってantのタスクをbatファイルから↓のような感じで、
    ・辞書のクリーン
    ・辞書のコンパイル(独自辞書追加済み)
    ・jarファイルへのアーカイブ化
    タスクを叩きます。
    #call付けてやらないとダメなのね。昔やったような気がするけど忘れてました。。

    @echo off
    echo --------------------------------------------------------
    cd C:/lucene-gosen/dictionary
    echo --------------------------------------------------------
    call C:/lucene-gosen/apache-ant-1.8.2/bin/ant clean-sen
    echo -------------------------------------------------------
    call C:/lucene-gosen/apache-ant-1.8.2/bin/ant -Dcustom.dics=oreore.csv
    echo --------------------------------------------------------
    cd C:/lucene-gosen
    echo --------------------------------------------------------
    call C:/lucene-gosen/apache-ant-1.8.2/bin/ant -Dproxy.host=hogehoge.jp -Dproxy.port=9999
    

     
    ソースは↓のようにRuntimeのexecのって感じで。

        public String execute() throws Exception {
            try{
                Process process = Runtime.getRuntime().exec("C:/lucene-gosen/dic_compile.bat");
                InputStream is = process.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
                br.close();
                is.close();
            }catch(IOException e){
                e.printStackTrace();
            }
            return SUCCESS;
        }
    

     
     
    ■ 作ったアプリケーションを動かしてみます
     
    画面から”ホゲちゃん”を追加してみます。

    ログも出てます↓

    2012-02-15 20:54:27.600::INFO:  Started SelectChannelConnector@0.0.0.0:8080
    [INFO] Started Jetty Server
    [INFO] Starting scanner at interval of 10 seconds.
    keyword: ホゲちゃん
    cost: 3000
    partofspeech: 名詞
    pronunciations: ホゲチャン
    

     
    追加用の辞書ファイル(oreore.csv)に”ホゲちゃん”が追加されているのが確認できます。

    "コボちゃん",3000,名詞,固有名詞,人名,名,*,*,"コボちゃん","コボチャン","コボチャン"
    "ホゲちゃん",3000,名詞,固有名詞,人名,名,*,*,"ホゲちゃん","ホゲチャン","ホゲチャン"
    

     
    続いてWeb画面から辞書のコンパイルタスクを発行するボタンをクリックします。

     
    標準出力に↓以下のようにantの結果が出力されています。

    jar:
          [jar] Building jar: C:lucene-gosendistlucene-gosen-1.3-dev-ipadic.jar
    
    BUILD SUCCESSFUL
    Total time: 3 seconds
    

    辞書のクリーン、辞書のコンパイル(独自辞書追加済み)、jarファイルへのアーカイブ化
    の3つのantタスクが完了しているのを確認出来ました。
     
     
    ■ Solrに組み込んで再起動してアクセスすると、、、
     
    #ってかここもシェル化して一気に最後まで自動でやっちゃえばイイよね。。

    C:lucene-gosendist>dir
    2012/02/15  17:57         8,297,901 lucene-gosen-1.3-dev-ipadic.jar
    C:lucene-gosendist>copy lucene-gosen-1.3-dev-ipadic.jar C:apache-solr-3.5.0examplesolrlib
    C:apache-solr-3.5.0examplesolrliblucene-gosen-1.3-dev-ipadic.jar を上書きしますか? (Yes/No/All): Yes
            1 個のファイルをコピーしました。
    

    Solrを起動します。

    C:apache-solr-3.5.0example>java -jar start.jar
    2012-02-15 20:07:20.981:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
    2012-02-15 20:07:21.146:INFO::jetty-6.1-SNAPSHOT
    2 15, 2012 8:07:22 午後 org.apache.solr.core.SolrResourceLoader locateSolrHome
    C:lucene-gosendist>cd C:apache-solr-3.5.0example
    C:apache-solr-3.5.0example>java -jar start.jar
    2012-02-15 20:07:20.981:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
    2012-02-15 20:07:21.146:INFO::jetty-6.1-SNAPSHOT
    ~略~
    2 15, 2012 8:07:26 午後 org.apache.solr.servlet.SolrUpdateServlet init
    情報: SolrUpdateServlet.init() done
    2012-02-15 20:07:26.259:INFO::Started SocketConnector@0.0.0.0:8983
    

     
    Solrの画面からアクセスすると、追加した”ホゲちゃん”で形態素解析できました!

     

    Struts2は画面の遷移云々やValidationにXML書かなきゃいけないっぽいので、
    SAStrutsやSpringMVCの方がお手軽かなと思いますが、
    昔みたいにいっぱいXMLやバリューオブジェクト作らなくてもOKそうなので、
    その辺はお手軽な感じかなぁと思いました。
     

    はじめてのJavaフレームワーク―Struts 2/Spring/Hibernate対応 (TECHNICAL MASTER)
    岡田 賢治
    秀和システム
    売り上げランキング: 192704

     

    Apache Solr入門 ―オープンソース全文検索エンジン
    関口 宏司 三部 靖夫 武田 光平 中野 猛 大谷 純
    技術評論社
    売り上げランキング: 36893

    コメント

    タイトルとURLをコピーしました