→Browsing Mac OS X!

WebObjects and OpenBase情報

2003年 7月 15日 (火)更新
新居雅行(msyk@msyk.net)


このページは、著書である「WebObjectsワークブック」に関わることを中心に、WebObjectsやOpenBase Internationalについての情報をお届けするものです。


OpenBaseで日本語の文字化けをしないようにテキストファイルからインポート

OpenBase 7.0.13の状況を記載しておきます。日本語テキストファイルのインポートで、きれいには動いてはくれませんので、以下のように作業をしてください。これで、データベースにテキストファイルは読み込まれます。

  1. テキストファイルを用意します。いちおう、タブ区切りで、文字列の囲み記号はないというのが標準のようです。ここで、テキストのキャラクタセットは、データベースに設定されたキャラクタセットにします。データベースがShift-JISなら、テキストファイルもShift-JISで作成しておきます。
  2. Mac OS Xのシステム環境設定にある言語環境(International)で、「言語」のタブで、Englishをリストのいちばん上にして、Mac OS X自体を再起動します。小細工はしないで(笑)、ともかく、再起動までした方がいいようです。
  3. OpenBase Manager(ApplicationsのOpenBaseにある)を起動します。環境設定にあるGeneral(一般)のタブで、International sort orderのポップアップをOtherを選択して、その下のフィールドをクリアします。
  4. OpenBase Managerで、読み込みたいデータベースを選択します。そして、Toolメニューからこのファイルを、Import Tabular Dataを選択します。
  5. 最初に、読み込むテキストファイルを選択しますが、このとき、テキストファイル自体は日本語を含むパスにならないようにしておく必要があるようです。ユーザのホームに置いておくのが無難だと思われます。
  6. シートが出てくるので、文字列の開始文字、終了文字を削除し、改行コードを適切なものに選択するなど、テキストデータに合わせて指定をします。
  7. テキストファイルの最初の方を読み出してリストに表示するウインドウが出てきますが、文字化けしますがそれは無視します。ここで、左側に読み込むテーブル名を選択し、さらにそのカラム名を右側のリストの見出し部分にドラッグ&ドロップして、どの列とどのカラムを対応しているかを設定します。実際のデータが見えないのが不便ですが、テキストファイルを参照しながら対応付けを行うと良いでしょう。(なお、この設定は面倒なので、やり直すときにスムーズに作業できるように、ボタンを押して設定を必ずテキストファイルに保存しておきましょう)
  8. これで、インポートすれば、OKです。

「WebObjectsワークブック」

ご購入いただける場合は、こちらから(楽天ブックスで購入されると送料は無料です)。

訂正

p.85のリスト エンコードも含めて以下のように入力してください。p.86に図があるのでそちらをごらんいただいて正しく入力された方もいらっしゃるかと思いますが、エンコードは「Shift_JIS」にするのが多分いちばん素直かと思います。

public void takeValuesFromRequest(WORequest aRequest, WOContext aContent) {
aRequest.setDefaultFormValueEncoding("Shift_JIS");
aRequest.setFormValueEncodingDetectionEnabled(true);
super.takeValuesFromRequest(aRequest, aContent);
}

public void appendToResponse(WOResponse aResponse, WOContext aContent) {
aResponse.setContentEncoding("Shift_JIS");
aResponse.setHeader("text/html; charset=Shift_JIS", "Content-Type");
super.appendToResponse(aResponse, aContent);
}

このソースをコピーしてペーストする場合、インデントの部分でスペーサを使っていますので、必要に応じて編集をしてください。あるいは、以下のプログラム紹介部分をごらんください。

…言い訳

以前にも、ときどき、ソースに間違いがあると指摘いただいていたのですが、個人的には「そんなはずはない」とずっと思い込んでいました。というのは、実はこの書籍を制作するとき、校正を見てプログラムソースがほとんど使い物にならないレイアウトになっていたんで、全部、横幅を指定してもらって、テキストファイルで入稿しなおしています。しかも、Project Builderで直してコンパイルをかけてチェックしたものから、コピー&ペーストしているので、「間違えているはずはない」と思い込んでいたのでした。

ただ、時間がないとかの理由で、ソースを全部差し替えた後にチェックをしていないのも事実で、これはうかつでした。ただ、それでも混乱するだろうと思って、最後の手段として、以下のように、ソースコードをすべてテキストでお見せして、場合によってはコピペできるようにするためのページも用意していたのですが、まったく活用されないままここまで来ました。編集担当者はすでに広文社にはいないので、おそらく確実に同社のページからリンクされることはないと思うので、こちらで公開をします。

この本ですが、もともとは、オンラインマガジンのMDOnlineでの記事を書籍化するという話で進めていたのですが、ある程度作業が進んだところで出版社側から最終的に出版をするという確約がもらえなかったため、作業を止めていました。ところが、いきなり1,2週間以内に原稿をもらえないと出版できないというような話になって大騒ぎで原稿をまとめたという経緯もあります。そのため、校正をちゃんと見る時間がなかったのも事実です。いろいろご迷惑をおかけしますが、ご理解ください。

また、間違っているとご指摘いただくのは大変助かるのですが、できれば、何ページに間違いがあるのかということを的確にご指示いただければと思います。よろしくお願いします。

書籍で紹介したアプリケーションのプログラムソース

実は、以下のページも作ってあったのですが、一向に活用されないので、こちらで公開をします。

3章のサンプルプログラム

ソースファイル名:Application.java

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;

public class Application extends WOApplication {

    public static void main(String argv[]) {
        WOApplication.main(argv, Application.class);
    }

    public Application() {
        super();
        System.out.println("Welcome to " + this.name() + "!");
        
        /* ** Put your application initialization code here ** */
    }

    public void takeValuesFromRequest(WORequest aRequest, WOContext aContext) {
        aRequest.setDefaultFormValueEncoding("SJIS");
        aRequest.setFormValueEncodingDetectionEnabled(true);
        super.takeValuesFromRequest(aRequest, aContext);
    }

    public void appendToResponse(WOResponse aResponse, WOContext aContext) {
        aResponse.setContentEncoding("SJIS");
        super.appendToResponse(aResponse, aContext);
    }
}

ソースファイル名:Main.java

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;

public class Application extends WOApplication {

    public static void main(String argv[]) {
        WOApplication.main(argv, Application.class);
    }

    public Application() {
        super();
        System.out.println("Welcome to " + this.name() + "!");
        
        /* ** Put your application initialization code here ** */
    }

    public void takeValuesFromRequest(WORequest aRequest, WOContext aContext) {
        aRequest.setDefaultFormValueEncoding("SJIS");
        aRequest.setFormValueEncodingDetectionEnabled(true);
        super.takeValuesFromRequest(aRequest, aContext);
    }

    public void appendToResponse(WOResponse aResponse, WOContext aContext) {
        aResponse.setContentEncoding("SJIS");
        super.appendToResponse(aResponse, aContext);
    }
}

ソースファイル名:Main.java

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;

public class Main extends WOComponent {
    protected WODisplayGroup personaladdressDisplayGroup;

    /** @TypeInfo Personaladdress */
    protected EOEnterpriseObject addressKey;

    public Main(WOContext context) {
        super(context);
    }
    public InputPage moveInputPage()
    {
        InputPage nextPage = (InputPage)pageWithName("InputPage");
    
        session().defaultEditingContext().revert();
        personaladdressDisplayGroup.insert();
        nextPage.setAddressKey(
            (EOEnterpriseObject)personaladdressDisplayGroup.selectedObject());
   
        return nextPage;
    }
}

ソースファイル名:InputPage.java

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;

public class InputPage extends WOComponent {
    /** @TypeInfo Personaladdress */
    protected EOEnterpriseObject addressKey;

    public InputPage(WOContext context) {
        super(context);
    }

    public void setAddressKey(EOEnterpriseObject newAddressKey)
    {
        addressKey = newAddressKey;
    }

    public Main submitAction()
    {
        session().defaultEditingContext().saveChanges();
        Main nextPage = (Main)pageWithName("Main");
        // Initialize your component here
        return nextPage;
    }
}

4〜5章 SimpleBoard

ソースファイル名:Application.java

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;

public class Application extends WOApplication {
    
    public static void main(String argv[]) {
        WOApplication.main(argv, Application.class);
    }

    public Application() {
        super();
        System.out.println("Welcome to " + this.name() + "!");
        
        /* ** Put your application initialization code here ** */
    }

    public void takeValuesFromRequest(WORequest aRequest, WOContext aContext) {
        aRequest.setDefaultFormValueEncoding("Shift_JIS");
        aRequest.setFormValueEncodingDetectionEnabled(true);
        super.takeValuesFromRequest(aRequest, aContext);
    }
	    
	
    public void appendToResponse(WOResponse aResponse, WOContext aContext) {
        aResponse.setContentEncoding("SJIS");
        super.appendToResponse(aResponse, aContext);
        aResponse.setHeader("text/html; charset=SHIFT_JIS", "content-type");
    }
}

ソースファイル名:Main.java

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;

public class Main extends WOComponent {
    protected WODisplayGroup dgBoard;
    protected Board aBoard;
    protected boolean deleting;
    protected String strDeletePass;

    /** @TypeInfo Message */
    protected NSArray arrayResult;
    protected Message itemMessage;
    protected String keyString;

    public Main(WOContext context) {
        super(context);
        
        session().defaultEditingContext().revert();
        refetch();
     
        deleting = false;
    }

    public MessageListPage actionMessageListPage()
    {
        MessageListPage nextPage = (MessageListPage)pageWithName("MessageListPage");
        nextPage.setBoard(aBoard);
        return nextPage;
    }

    public Board aBoard()
    {
        return aBoard;
    }


    public void setABoard(Board newABoard)
    {
        aBoard = newABoard;
    }

    public WOComponent actionDelete()
    {
        session().defaultEditingContext().revert();
        deleting = true;
        dgBoard.setSelectedObject(aBoard);
        
        return null;
    }

    public boolean deleting()
    {
        return deleting;
    }

    public void setDeleting(boolean newDeleting)
    {
        deleting = newDeleting;
    }

    public String strDeletePass()
    {
        return strDeletePass;
    }

    public void setStrDeletePass(String newStrDeletePass)
    {
        strDeletePass = newStrDeletePass;
    }

    public WOComponent actionEnterPass()
    {
        try	{
            String pass = (String)((EOEnterpriseObject)dgBoard.selectedObject()).valueForKey("password");
            if(strDeletePass != null && strDeletePass.equals(pass))	{
                dgBoard.delete();
                session().defaultEditingContext().saveChanges();
                deleting = false;
            }
        }
        catch (Exception ex)	{
            System.out.println("Main.actionEnterPass : " + ex.toString());
        }
        return null;
    }

    public WOComponent actionPassCancel()
    {
        deleting = false;
        session().defaultEditingContext().revert();
        return null;
    }

    public boolean hasResult()
    {
        return arrayResult != null && arrayResult.count() > 0;
    }

    /** @TypeInfo Message */
    public NSArray arrayResult()
    {
        return arrayResult;
    }

    public void setArrayResult(NSArray newArrayResult)
    {
        arrayResult = newArrayResult;
    }

    public Message itemMessage()
    {
        return itemMessage;
    }

    public void setItemMessage(Message newItemMessage)
    {
        itemMessage = newItemMessage;
    }

    public String keyString()
    {
        return keyString;
    }

    public void setKeyString(String newKeyString)
    {
        keyString = newKeyString;
    }

    public WOComponent actionSearch()
    {
        if (keyString != null)	{
            String str = "*" + keyString + "*";
            EOQualifier qual = EOQualifier.qualifierWithQualifierFormat("message like %@", new NSArray(str));
            EOSortOrdering sort = EOSortOrdering.sortOrderingWithKey("updated", EOSortOrdering.CompareAscending);
            EOFetchSpecification fs = new EOFetchSpecification("Message", qual, new NSArray(sort));
            arrayResult = session().defaultEditingContext().objectsWithFetchSpecification(fs);
       }
        return null;
    }

    public boolean inserting()
    {
        return session().defaultEditingContext().insertedObjects().count() > 0;
    }

    public WOComponent actionInsert()
    {
        deleting = false;

        session().defaultEditingContext().revert();
        dgBoard.insert();
        
        return null;
    }

    public WOComponent actionCancelInsert()
    {
        session().defaultEditingContext().revert();
        refetch();
        return null;
    }

    public WOComponent actionSaveInsertion()
    {
        Board eo = (Board)dgBoard.selectedObject();
        if (eo != null && eo.boardName() != null && eo.boardOwner() != null && eo.password() != null)	{
            NSTimestamp now = new NSTimestamp();
            eo.setCreated(now);
            eo.setUpdated(now);
            try	{
                session().defaultEditingContext().saveChanges();
                refetch();
            }
            catch (Exception ex)	{
                System.out.println("Main.actionSaveInsertion : " + ex.toString());
            }
        }
        return null;
    }
    private void refetch()	{
        dgBoard.fetch();
        dgBoard.updateDisplayedObjects();
    }
}

ソースファイル名:MessagePage.java

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;

public class MessagePage extends WOComponent {
    protected Message newMessage;
    protected boolean isDelete;
    protected String strKey;

    protected Message itemMessage;

    public MessagePage(WOContext context) {
        super(context);
    }

    public Message newMessage()
    {
        return newMessage;
    }

    public void setNewMessage(Message newNewMessage)
    {
        newMessage = newNewMessage;
    }

    public MessageListPage actionSubmit()
    {
        try	{
            newMessage.setUpdated(new NSTimestamp());
            session().defaultEditingContext().saveChanges();
        }
        catch (Exception ex)	{
            debugString(ex.toString());
            return null;
        }
        
        MessageListPage nextPage = (MessageListPage)pageWithName("MessageListPage");
        nextPage.setBoard(newMessage.eoBoard());
        return nextPage;
    }

    public MessageListPage actionAbort()
    {
        session().defaultEditingContext().revert();
        MessageListPage nextPage = (MessageListPage)pageWithName("MessageListPage");
        nextPage.setBoard(newMessage.eoBoard());
        return nextPage;
    }

    public boolean isDelete()
    {
        return isDelete;
    }

    public void setIsDelete(boolean newIsDelete)
    {
        isDelete = newIsDelete;
    }

    public MessageListPage actionDelete()
    {
 
        MessageListPage page = null;
        try	{
            if (strKey.equals(newMessage.password()) || strKey.equals("kesiteyaru"))	{
                Board board = newMessage.eoBoard();
                session().defaultEditingContext().revert();
                session().defaultEditingContext().deleteObject(newMessage);
                session().defaultEditingContext().saveChanges();
                page = (MessageListPage)pageWithName("MessageListPage");
                page.setBoard(board);
            }
            else	{
                strKey = "cannot delete";
            }
        }
        catch (Exception ex)	{
            debugString(ex.toString());
            page = null;
        }
        return page;
    }

    public String strKey()
    {
        return strKey;
    }

    public void setStrKey(String newStrKey)
    {
        strKey = newStrKey;
    }
    
    public void setMessageForDelete(Message value)
    {
        isDelete = true;
        newMessage = value;
    }
    public Message itemMessage()
    {
        return itemMessage;
    }

    public void setItemMessage(Message newItemMessage)
    {
        itemMessage = newItemMessage;
    }

    public WOComponent actionInsert()
    {
        return null;
    }
}

ソースファイル名:MessageListPage.java

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;

public class MessageListPage extends WOComponent {
    protected WODisplayGroup dgMessage;
    protected Message aMessage;
    protected Board board;

    public MessageListPage(WOContext context) {
        super(context);
    }

    public Message aMessage()
    {
        return aMessage;
    }

    public void setAMessage(Message newAMessage)
    {
        aMessage = newAMessage;
    }

    public Main actionMain()
    {
        Main nextPage = (Main)pageWithName("Main");
        // Initialize your component here
        return nextPage;
    }

    public MessagePage actionNewMessage()
    {
        MessagePage nextPage = (MessagePage)pageWithName("MessagePage");
        session().defaultEditingContext().revert();
        dgMessage.insert();
        nextPage.setNewMessage((Message)dgMessage.selectedObject());
        return nextPage;
    }

    public MessagePage actionDelete()
    {
        MessagePage nextPage = (MessagePage)pageWithName("MessagePage");
        session().defaultEditingContext().revert();
        nextPage = setMessageForDelete(aMessage);
        return nextPage;
    }
    public Board board()
    {
        return board;
    }

    public void setBoard(Board newBoard)
    {
        board = newBoard;
 
        dgMessage.setQualifier(EOQualifier.qualifierWithQualifierFormat("eoParent = null", null));
        dgMessage.setMasterObject(newBoard);
        dgMessage.fetch();
        dgMessage.updateDisplayedObjects();
    }
}

ソースファイル名:OneMessageBox.java

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;

public class OneMessageBox extends WOComponent {
    protected Message aMessage;
    protected Message aComment;
    protected WODisplayGroup dgMessage;

    public OneMessageBox(WOContext context) {
        super(context);
    }

    public Message aMessage()
    {
        return aMessage;
    }

    public void setAMessage(Message newAMessage)
    {
        aMessage = newAMessage;
    }

    public Message aComment()
    {
        return aComment;
    }

    public void setAComment(Message newAComment)
    {
        aComment = newAComment;
    }

    public WODisplayGroup dgMessage()	
    {
        return dgMessage;
    }

    public void setDgMessage(WODisplayGroup newDgMessage)
    {
        dgMessage = newDgMessage;
    }
    public MessagePage actionComment()
    {
        MessagePage nextPage = (MessagePage)pageWithName("MessagePage");
        String strTitle = aMessage.title();
        String strMessage = aMessage.message();
       
        session().defaultEditingContext().revert();
        dgMessage.insert();
        Message commentMessage = (Message)dgMessage.selectedObject();
        if ( strTitle != null )
            commentMessage.setTitle("re: "+ strTitle);
        if ( strMessage != null )	{
            NSArray lines = NSArray.componentsSeparatedByString(strMessage, "\n");
            commentMessage.setMessage("> " + lines.componentsJoinedByString("\n> "));
        }

        aMessage.addObjectToBothSidesOfRelationshipWithKey(commentMessage, "arrayComment");
        nextPage.setNewMessage(commentMessage);
        return nextPage;
    }
}