サーバ側を Java でクライアントを Flex にするとなんだかスゴいものを作っているような気がしていたが別にそんなことはなかったぜ!(ソードマスターヤマト的な意味で)
flex から更新要求が来たら鯖側の java が twitter4j 経由で twitter のデータをガメてきて S2BlazeDS 経由で flex に投げるという何だかすごいムダなことをしています。
最初は Java-AS3 間でコレクションのマッピングどうやんのかなー BlazeDS Developer Guide を見ると java.util.Collection と mx.collections.ArrayCollection でイケるのかーじゃあ実験しよう。なんかテキトーな配列データを用意しなきゃ……そうだ twitter4j があるじゃなーい、という流れ。よくわからない? すいません自分もよくわかりません。
せっかくなので以下ソース。
まづ java 側から。ちなみに S2BlazeDS のサンプルプロジェクトに追加する形でつくってしまってます。
package flex.samples.service; import java.util.ArrayList; import java.util.Collection; import java.util.List; import twitter4j.Status; import twitter4j.Twitter; import twitter4j.TwitterException; import flex.samples.dto.TwitterStatusDto; public class Twitter4JService { public Collection<TwitterStatusDto> getStatuses() { Collection<TwitterStatusDto> ret = new ArrayList<TwitterStatusDto>(); Twitter unauthenticatedTwitter = new Twitter(); try { List<Status> statuses = unauthenticatedTwitter.getPublicTimeline(); for (Status status : statuses) { TwitterStatusDto dto = new TwitterStatusDto(); dto.id = status.getId(); dto.name = status.getUser().getName(); dto.screenName = status.getUser().getScreenName(); dto.text = status.getText(); dto.profileImageURL = status.getUser().getProfileImageURL().toString(); ret.add(dto); } } catch (TwitterException e) { e.printStackTrace(); } return ret; } }
package flex.samples.dto; public class TwitterStatusDto { public int id; public String name; public String screenName; public String text; public String profileImageURL; }
こっから Flex 側。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" height="498" applicationComplete="init()"> <mx:Script> <![CDATA[ import dto.TwitterStatusDto2; import dto.TwitterStatusDto; import mx.rpc.events.ResultEvent; import mx.collections.ArrayCollection; import mx.rpc.events.FaultEvent; [Bindable] private var gridData:ArrayCollection; private function init():void { gridData = new ArrayCollection(); } private function r(event:ResultEvent):void { var arr:ArrayCollection = twitterSrv.getStatuses.lastResult; for each (var s:TwitterStatusDto in arr) { gridData.addItem({name:s.name, screenName:s.screenName, text:s.text, profileImageUrl:s.profileImageURL}); } } private function f(event:FaultEvent):void { trace("fault"); } private function buttonHandler():void { twitterSrv.getStatuses(); } private function gridMouseDown(event:MouseEvent):void { profileImage.load(dataGrid.selectedItem.profileImageUrl); text.text = dataGrid.selectedItem.text; } ]]> </mx:Script> <mx:HBox width="100%" height="106"> <mx:Image id="profileImage" alpha="1.0" width="48" height="48"/> <mx:Text id="text" text="てすと" width="100%" height="100%" fontSize="21" fontWeight="bold"/> </mx:HBox> <mx:RemoteObject id="twitterSrv" destination="twitter4JService" result="r(event)" fault="f(event)"/> <mx:DataGrid id="dataGrid" width="100%" dataProvider="{gridData}" height="163" mouseDown="gridMouseDown(event)"> <mx:columns> <mx:DataGridColumn headerText="なまえ" width="20" dataField="name"/> <mx:DataGridColumn headerText="すくりーんなまえ" width="20" dataField="screenName"/> <mx:DataGridColumn headerText="はつげん" width="80" dataField="text"/> </mx:columns> </mx:DataGrid> <mx:Button id="button" label="更新" click="buttonHandler()"/> </mx:Application>
package dto { [RemoteClass(alias="flex.samples.dto.TwitterStatusDto")] public class TwitterStatusDto { public var id:int; public var name:String; public var screenName:String; public var text:String; public var profileImageURL:String; public function TwitterStatusDto() { } } }