Acabo de terminar la version AIR, que no resulto tan obvio como creia.
Resulta que AIR no conoce la url de los servicios y por eso hay que definirsela. La modificación que habia pensado era solo pasarle la url al TodoListHandlerMap. Pero resulta que el ChannelSet y los servicios de remoting necesitan de esa url.
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
xmlns:common="library://ns.cubikalabs.todolist.common"
xmlns:view="org.cubikalabs.todolist.common.view.*">
<fx:Declarations>
<common:TodoListHandlerMap url="http://localhost:8080/todolist-blazeds-web/messagebroker/amf" />
</fx:Declarations>
Para salvar el tema de inicialización hice la asignación de la url asi:
<?xml version="1.0" encoding="utf-8"?>
<mate:EventMap xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:mate="http://mate.asfusion.com/"
>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.events.FlexEvent;
import mx.messaging.ChannelSet;
import mx.messaging.channels.AMFChannel;
import mx.messaging.config.ServerConfig;
import mx.rpc.Fault;
import org.cubikalabs.todolist.common.events.SecurityEvent;
import org.cubikalabs.todolist.common.events.TodoListEvent;
import org.cubikalabs.todolist.common.model.*;
import org.cubikalabs.todolist.common.view.*;
[Bindable]
public var url:String = null;
private function log(msg:String):void
{
trace(msg);
}
private function alert(msg:String, fault:Fault):void
{
Alert.show( fault.faultString, msg + ": " + fault.faultCode );
trace(msg);
}
private var channel:AMFChannel;
[Bindable]
private var channelSet:ChannelSet = new ChannelSet();
private function setupChannelSet():void
{
channel = new AMFChannel("my-amf", url);
channelSet.addChannel(channel);
}
]]>
</fx:Script>
<fx:Declarations>
<mate:Debugger level="{Debugger.ALL}" />
<mate:EventHandlers type="{ FlexEvent.INITIALIZE }">
<mate:InlineInvoker method="setupChannelSet" />
<mate:ObjectBuilder generator="{ TodoListManager }" cache="global" />
<mate:ObjectBuilder generator="{ LoginPanelModel }" cache="global" />
<mate:ObjectBuilder generator="{ TodoListPanelModel }" cache="global" />
</mate:EventHandlers>
<mate:Injectors target="{ LoginPanel }">
<mate:PropertyInjector source="{ LoginPanelModel }"
targetKey="model" />
</mate:Injectors>
<mate:Injectors target="{ TodoListPanel }">
<mate:PropertyInjector source="{ TodoListPanelModel }"
targetKey="model" />
</mate:Injectors>
<mate:Injectors target="{ LoginPanelModel }">
<mate:PropertyInjector source="{ TodoListManager }"
sourceKey="loginState"
targetKey="loginState" />
</mate:Injectors>
<mate:Injectors target="{ TodoListPanelModel }">
<mate:PropertyInjector source="{ TodoListManager }"
sourceKey="todoList"
targetKey="todoList" />
</mate:Injectors>
<s:RemoteObject
id="roTodoService"
endpoint="http://localhost:8080/todolist-blazeds-web/messagebroker/amf"
destination="todoService" />
<mate:EventHandlers type="{ SecurityEvent.LOGIN }">
<mate:InlineInvoker method="log" arguments="{ [ 'Login in progress' ]}" />
<mate:ChannelSetLoginInvoker username="{ event.username }" password="{ event.password }"
channelSet="{ channelSet }" channelSetName="my-amf" >
<mate:resultHandlers>
<mate:InlineInvoker method="log" arguments="{ [ 'Login Succes' ]}" />
<mate:MethodInvoker generator="{ TodoListManager }"
method="setLoginState"
arguments="{ [ TodoListConstants.LOGIN_STATE_SECURE ] }" />
<mate:EventAnnouncer type="{ TodoListEvent.GET_TODOLIST }" />
</mate:resultHandlers>
<mate:faultHandlers>
<mate:InlineInvoker method="log" arguments="{ [ 'Login error: TODO!' ]}" />
</mate:faultHandlers>
</mate:ChannelSetLoginInvoker>
</mate:EventHandlers>
<mate:EventHandlers type="{ SecurityEvent.LOGOUT }">
<mate:InlineInvoker method="log" arguments="{ [ 'Logout in progress' ]}" />
<mate:ChannelSetLogoutInvoker channelSet="{ channelSet }" >
<mate:resultHandlers>
<mate:InlineInvoker method="log" arguments="{ [ 'Logout Ok' ]}" />
<mate:MethodInvoker generator="{ TodoListManager }"
method="setLoginState"
arguments="{ [ TodoListConstants.LOGIN_STATE_INSECURE ] }" />
<mate:EventAnnouncer type="{ TodoListEvent.CLEAN_TODOLIST }" />
</mate:resultHandlers>
<mate:faultHandlers>
<mate:InlineInvoker method="log" arguments="{ [ 'Error en Logout' ]}" />
</mate:faultHandlers>
</mate:ChannelSetLogoutInvoker>
</mate:EventHandlers>
<mate:EventHandlers type="{ TodoListEvent.GET_TODOLIST }">
<mate:InlineInvoker method="log" arguments="{ [ 'Getting TodoList' ]}" />
<mate:RemoteObjectInvoker destination="todoService" method="getTodoList"
channelSet="{ channelSet }">
<mate:resultHandlers>
<mate:InlineInvoker method="log" arguments="{ [ 'TodoList OK' ]}" />
<mate:MethodInvoker generator="{ TodoListManager }"
method="setTodoList"
arguments="{ [ resultObject ] }" />
</mate:resultHandlers>
<mate:faultHandlers>
<mate:InlineInvoker method="log" arguments="{ [ 'TodoList Error' ]}" />
</mate:faultHandlers>
</mate:RemoteObjectInvoker>
</mate:EventHandlers>
<mate:EventHandlers type="{ TodoListEvent.CLEAN_TODOLIST }">
<mate:InlineInvoker method="log" arguments="{ [ 'Cleanning TodoList' ]}" />
<mate:MethodInvoker generator="{ TodoListManager }"
method="setTodoList"
arguments="{ [ null ] }" />
</mate:EventHandlers>
<mate:EventHandlers type="{ TodoListEvent.SAVE_TODO }">
<mate:InlineInvoker method="log" arguments="{ [ 'Saving TodoList' ]}" />
<mate:RemoteObjectInvoker destination="todoService"
method="saveTodo"
arguments="{ [ event.todo ] }"
channelSet="{ channelSet }" >
<mate:resultHandlers>
<mate:EventAnnouncer type="{ TodoListEvent.GET_TODOLIST }" />
</mate:resultHandlers>
<mate:faultHandlers>
<mate:InlineInvoker method="alert" arguments="{ [ 'Save Todo Error', fault ]}" />
</mate:faultHandlers>
</mate:RemoteObjectInvoker>
</mate:EventHandlers>
</fx:Declarations>
</mate:EventMap>
-34.602994
-58.373237