Re: [Asterisk-java-users] How to get ORIGINATE_STATUS value after OriginateAction
Brought to you by:
srt
From: Mordechay K. <mka...@gm...> - 2013-03-06 15:18:04
|
B.H. Yves, thanks for the testing and the logs :-). That's exactly what i meant. At least in relation to dialing real PSTN numbers, matching the call by the dialed phone number will be a bad idea because it's not really unique. Theoretically, it's perfectly OK to dial the same number several times in parallel, at least if the destination is some kind of office PBX or IVR e t.c. Maybe, to workaround it will be possible to dial to "local" channel, answer() the call and then dial out from the dialplan. Then OriginateAction will always succeed almost immediately and then application will be able to track the actual dial out process by tracking the bridged channel. But IMHO it will require a lot of resources and not really practical with significant call volumes. Thanks for the advice, anyway :-) On Wed, Mar 6, 2013 at 4:56 PM, Yves A. <yv...@gm...> wrote: > maybe we talk about different things, but if i run my given code, i can > see status updates via callbackhandler... > I agree, that there is obviously no way to _immediately_ get the channelID > via asynchronous dial, but thats > no problem, because you can pass your own references to the > callbackhandler constructor. In my example it > is a simple string, but you could pass any other object there.. > if your listening to ami events only, you could match the value of the > channel (event.getChannel) against the > "number" you dialed and can track any state of your call this way.... (but > i admit... there are nuts and bolts... > redirecting calls, ringgroups, followme, local channels, queues and so on > can make track a call quite hard...) > > the following example uses callbackhandler plus eventlisteners to get all > information in realtime: > > package tests; > > > import org.asteriskjava.live.AsteriskChannel; > import org.asteriskjava.live.AsteriskQueueEntry; > import org.asteriskjava.live.AsteriskServerListener; > import org.asteriskjava.live.DefaultAsteriskServer; > import org.asteriskjava.live.MeetMeUser; > import org.asteriskjava.live.internal.AsteriskAgentImpl; > import org.asteriskjava.manager.ManagerConnection; > import org.asteriskjava.manager.ManagerEventListener; > import org.asteriskjava.manager.action.OriginateAction; > import org.asteriskjava.manager.event.BridgeEvent; > import org.asteriskjava.manager.event.ChannelUpdateEvent; > import org.asteriskjava.manager.event.DialEvent; > import org.asteriskjava.manager.event.HangupEvent; > import org.asteriskjava.manager.event.LinkEvent; > import org.asteriskjava.manager.event.ManagerEvent; > import org.asteriskjava.manager.event.NewAccountCodeEvent; > import org.asteriskjava.manager.event.NewCallerIdEvent; > import org.asteriskjava.manager.event.NewChannelEvent; > import org.asteriskjava.manager.event.NewStateEvent; > import org.asteriskjava.manager.event.OriginateFailureEvent; > import org.asteriskjava.manager.event.OriginateResponseEvent; > import org.asteriskjava.manager.event.OriginateSuccessEvent; > import org.asteriskjava.manager.event.UnlinkEvent; > > > public class CallTestWithCallbackHandler implements > AsteriskServerListener, ManagerEventListener{ > > private static ManagerConnection managerConnection; > > public CallTestWithCallbackHandler() throws Exception{ > > DefaultAsteriskServer asteriskServer = new > DefaultAsteriskServer("SERVER", "USERNAME", "PASSWORD"); > asteriskServer.getManagerConnection().login(); > asteriskServer.addAsteriskServerListener(this); > asteriskServer.getManagerConnection().addEventListener(this); > > > > try { > OriginateAction originateAction = new OriginateAction(); > originateAction.setChannel("DAHDI/g0/SOURCENUMBERHERE"); > originateAction.setContext("from-sip"); > originateAction.setExten("DESTINATIONNUMBERHERE"); > originateAction.setPriority(1); > originateAction.setTimeout(15000l); > asteriskServer.originateAsync(originateAction, new > myCallbackHandler("TESTCALL")); > > System.out.println("now idling for a minute to get a > chance to receive events and states..."); > try { > Thread.sleep(60000); > } > catch (Exception e) { > System.out.println(e.getMessage()); > } > } > catch (Exception e) { > System.out.println(e.getMessage()); > } > } > > public static void main(String[] args) throws Exception{ > CallTestWithCallbackHandler aCall = new > CallTestWithCallbackHandler(); > } > > @Override > public void onNewAsteriskChannel(AsteriskChannel channel) { > System.out.println("new Channel created... data is: "+channel); > > } > > @Override > public void onNewMeetMeUser(MeetMeUser user) { > } > > @Override > public void onNewAgent(AsteriskAgentImpl agent) { > } > > @Override > public void onNewQueueEntry(AsteriskQueueEntry entry) { > } > > @Override > public void onManagerEvent(ManagerEvent event) { > // only print out relevant events here.. > if (event instanceof NewChannelEvent > || event instanceof ChannelUpdateEvent > || event instanceof OriginateResponseEvent > || event instanceof OriginateFailureEvent > || event instanceof OriginateSuccessEvent > || event instanceof NewCallerIdEvent > || event instanceof NewStateEvent > || event instanceof LinkEvent > || event instanceof UnlinkEvent > || event instanceof BridgeEvent > || event instanceof DialEvent > || event instanceof HangupEvent) > System.out.println("got Event: "+event); > > } > > } > > an execution prints out, what happens in detail during a call setup, the > call itself and the hangup.. > output of callbackhandler is blue, managerevents are red, serverevents > are violet and important details are *black,bold and underlined*... > with this trace you can see very well, what happens at which time... > > myCallbackHandler for reference TESTCALL just instantiated. > > now idling for a minute to get a chance to receive events and states... > got Event: org.asteriskjava.manager.event.*NewChannelEvent*[dateReceived='Wed > Mar 06 15:30:02 CET > 2013',privilege='call,all',callerid=null,sequencenumber=null,state='*Rsrvd > *',channelstate='1',calleridname=null,timestamp=null,uniqueid='* > 1362580137.4260* > ',context='from-pstn',exten=null,accountcode=null,server=null,calleridnum=null,channel='DAHDI/i1/SOURCENUMBERHERE-24d',channelstatedesc='Rsrvd',systemHashcode=1564136253] > got Event: org.asteriskjava.manager.event.*NewStateEvent*[dateReceived='Wed > Mar 06 15:30:02 CET > 2013',privilege='call,all',callerid=null,sequencenumber=null,state='Dialing',channelstate='3',calleridname=null,timestamp=null,uniqueid='1362580137.4260',server=null,calleridnum=null,channel='DAHDI/i1/SOURCENUMBERHERE-24d',channelstatedesc='Dialing',systemHashcode=959993440] > myCallbackHandler for reference TESTCALL receives state: Dialling, > channelID is: *1362580137.4260*, State is: RSRVD > new Channel created... data is: AsteriskChannel[id='*1362580137.4260*',name='DAHDI/i1/SOURCENUMBERHERE-24d',callerId='',state='RSRVD',account='null',dateOfCreation=Wed > Mar 06 15:30:02 CET > 2013,dialedChannel=null,dialingChannel=null,linkedChannel=null] > got Event: org.asteriskjava.manager.event.*NewStateEvent*[dateReceived='Wed > Mar 06 15:30:05 CET > 2013',privilege='call,all',callerid=null,sequencenumber=null,state='* > Ringing*',channelstate='5',calleridname=null,timestamp=null,uniqueid='* > 1362580137.4260* > ',server=null,calleridnum=null,channel='DAHDI/i1/SOURCENUMBERHERE-24d',channelstatedesc='Ringing',systemHashcode=591210723] > got Event: org.asteriskjava.manager.event.*NewStateEvent*[dateReceived='Wed > Mar 06 15:30:07 CET > 2013',privilege='call,all',callerid=null,sequencenumber=null,state='*Up* > ',channelstate='6',calleridname=null,timestamp=null,uniqueid='1362580137.4260',server=null,calleridnum=null,channel='DAHDI/i1/SOURCENUMBERHERE-24d',channelstatedesc='Up',systemHashcode=1084010740] > got Event: org.asteriskjava.manager.event.*OriginateResponseEvent*[dateReceived='Wed > Mar 06 15:30:07 CET > 2013',privilege='call,all',sequencenumber=null,reason='4',response='* > Success*',calleridname=null,timestamp=null,uniqueid='*1362580137.4260* > ',actionid='AJ_ORIGINATE_0',internalactionid='569616903_9',context='from-sip',exten='DESTINATIONNUMBERHERE',server=null,calleridnum=null,channel='DAHDI/i1/SOURCENUMBERHERE-24d',systemHashcode=1864729679] > myCallbackHandler for reference TESTCALL receives state: Success, > channelID is: *1362580137.4260*, State is: *UP* > got Event: org.asteriskjava.manager.event.*NewChannelEvent*[dateReceived='Wed > Mar 06 15:30:07 CET > 2013',privilege='call,all',callerid=null,sequencenumber=null,state='*Rsrvd > *',channelstate='1',calleridname=null,timestamp=null,uniqueid='* > 1362580141.4261* > ',context='from-pstn',exten=null,accountcode=null,server=null,calleridnum=null,channel='DAHDI/i1/DESTINATIONNUMBERHERE-24e',channelstatedesc='Rsrvd',systemHashcode=198249052] > got Event: org.asteriskjava.manager.event.*NewStateEvent*[dateReceived='Wed > Mar 06 15:30:07 CET > 2013',privilege='call,all',callerid='DESTINATIONNUMBERHERE',sequencenumber=null,state=' > *Dialing*',channelstate='3',calleridname=null,timestamp=null,uniqueid='* > 1362580141.4261* > ',server=null,calleridnum='DESTINATIONNUMBERHERE',channel='DAHDI/i1/DESTINATIONNUMBERHERE-24e',channelstatedesc='Dialing',systemHashcode=1832874625] > got Event: org.asteriskjava.manager.event.*DialEvent*[dateReceived='Wed > Mar 06 15:30:07 CET > 2013',privilege='call,all',subevent='Begin',callerid=null,dialstatus=null,sequencenumber=null, > *destuniqueid='1362580141.4261',srcuniqueid='1362580137.4260'* > ,destination='DAHDI/i1/DESTINATIONNUMBERHERE-24e',dialstring='g0/DESTINATIONNUMBERHERE',timestamp=null,calleridname=null,uniqueid='1362580137.4260',server=null,src='DAHDI/i1/SOURCENUMBERHERE-24d',calleridnum=null,channel='DAHDI/i1/SOURCENUMBERHERE-24d',systemHashcode=1000613778] > new Channel created... data is: AsteriskChannel[*id='1362580141.4261'* > ,name='DAHDI/i1/DESTINATIONNUMBERHERE-24e',callerId='',state='*RSRVD*',account='null',dateOfCreation=Wed > Mar 06 15:30:07 CET > 2013,dialedChannel=null,dialingChannel=null,linkedChannel=null] > got Event: org.asteriskjava.manager.event.*NewStateEvent*[dateReceived='Wed > Mar 06 15:30:12 CET > 2013',privilege='call,all',callerid='DESTINATIONNUMBERHERE',sequencenumber=null,state=' > *Ringing*',channelstate='5',calleridname=null,timestamp=null,uniqueid='* > 1362580141.4261* > ',server=null,calleridnum='DESTINATIONNUMBERHERE',channel='DAHDI/i1/DESTINATIONNUMBERHERE-24e',channelstatedesc='Ringing',systemHashcode=158635208] > got Event: org.asteriskjava.manager.event.*NewStateEvent*[dateReceived='Wed > Mar 06 15:30:14 CET > 2013',privilege='call,all',callerid=null,sequencenumber=null,state='*Up* > ',channelstate='6',calleridname=null,timestamp=null,uniqueid='* > 1362580141.4261* > ',server=null,calleridnum=null,channel='DAHDI/i1/DESTINATIONNUMBERHERE-24e',channelstatedesc='Up',systemHashcode=1232704349] > got Event: org.asteriskjava.manager.event.*BridgeEvent*[dateReceived='Wed > Mar 06 15:30:14 CET 2013',privilege='call,all',* > uniqueid1='1362580137.4260',uniqueid2='1362580141.4261'* > ,sequencenumber=null,bridgestate='*Link* > ',bridgetype='core',timestamp=null,channel1='DAHDI/i1/SOURCENUMBERHERE-24d',channel2='DAHDI/i1/DESTINATIONNUMBERHERE-24e',callerid1=null,server=null,callerid2=null,systemHashcode=45104096] > got Event: org.asteriskjava.manager.event.*BridgeEvent*[dateReceived='Wed > Mar 06 15:30:17 CET 2013',privilege='call,all',* > uniqueid1='1362580137.4260',uniqueid2='1362580141.4261'* > ,sequencenumber=null,bridgestate='*Unlink* > ',bridgetype='core',timestamp=null,channel1='DAHDI/i1/SOURCENUMBERHERE-24d',channel2='DAHDI/i1/DESTINATIONNUMBERHERE-24e',callerid1=null,server=null,callerid2=null,systemHashcode=277466206] > got Event: org.asteriskjava.manager.event.*HangupEvent*[dateReceived='Wed > Mar 06 15:30:17 CET 2013',privilege='call,all',causetxt='Normal > Clearing',callerid=null,cause='16',sequencenumber=null,calleridname=null,timestamp=null,uniqueid=' > *1362580141.4261* > ',server=null,calleridnum=null,channel='DAHDI/i1/DESTINATIONNUMBERHERE-24e',systemHashcode=2110683211] > got Event: org.asteriskjava.manager.event.*DialEvent*[dateReceived='Wed > Mar 06 15:30:17 CET > 2013',privilege='call,all',subevent='End',callerid=null,dialstatus='* > ANSWER*',sequencenumber=null,destuniqueid=null,srcuniqueid='* > 1362580137.4260* > ',destination=null,dialstring=null,timestamp=null,calleridname=null,uniqueid='1362580137.4260',server=null,src='DAHDI/i1/SOURCENUMBERHERE-24d',calleridnum=null,channel='DAHDI/i1/SOURCENUMBERHERE-24d',systemHashcode=1501740254] > got Event: org.asteriskjava.manager.event.*HangupEvent*[dateReceived='Wed > Mar 06 15:30:17 CET 2013',privilege='call,all',causetxt='Normal > Clearing',callerid=null,cause='16',sequencenumber=null,calleridname=null,timestamp=null,uniqueid=' > *1362580137.4260* > ',server=null,calleridnum=null,channel='DAHDI/i1/SOURCENUMBERHERE-24d',systemHashcode=373145787] > > > > regards, > yves > > Am 06.03.2013 13:23, schrieb Mordechay Kaganer: > > B.H. > > Hi > > There is indeed some problem with OriginateAction events - but it seems > to be asterisk's problem. When i send OriginateAction (in async mode, but > this doesn't really matter AFAIK), asterisk immediately create a channel > and starts to ring while it do generate all related AMI events like > NewChannelEvent, NewStateEvent on that channel, but until the call > is established or failed the AMI listener is unable to link between the > OriginateAction and the new channel. Only OriginateResponseEvent will > contain both OriginateAction's id and the newly created channel. This means > that there's no way to get status updates on ongoing originate action like > see if the channel is ringing or dialing or whatever, even that the same > app "sees" the new channel and it's status updates. > > At least, that's what i have learned from my experience. Maybe somebody > knows how to workaround this? > > > On Wed, Mar 6, 2013 at 1:38 PM, Yves A. <yv...@gm...> wrote: > >> hi, >> >> pls. see attached source... >> >> >> package tests; >> >> >> import org.asteriskjava.live.AsteriskChannel; >> import org.asteriskjava.live.DefaultAsteriskServer; >> import org.asteriskjava.live.LiveException; >> import org.asteriskjava.live.OriginateCallback; >> import org.asteriskjava.manager.ManagerConnection; >> import org.asteriskjava.manager.action.OriginateAction; >> >> >> public class CallTestWithCallbackHandler { >> >> private static ManagerConnection managerConnection; >> >> public static void main(String[] args) throws Exception{ >> >> DefaultAsteriskServer asteriskServer = new >> DefaultAsteriskServer("SERVER", "USER", "PASSWORD"); >> asteriskServer.getManagerConnection().login(); >> >> >> try { >> OriginateAction originateAction = new OriginateAction(); >> originateAction.setChannel("SIP/177"); //first leg >> originateAction.setContext("from-internal"); >> originateAction.setExten("08154711"); //second leg >> originateAction.setPriority(1); >> originateAction.setTimeout(15000); >> asteriskServer.originateAsync(originateAction, new >> myCallbackHandler("177")); >> System.out.println("now idling for a minute to get a >> chance to receive events and states..."); >> try { >> Thread.sleep(60000); >> } >> catch (Exception e) { >> System.out.println(e.getMessage()); >> } >> } >> catch (Exception e) { >> System.out.println(e.getMessage()); >> } >> } >> } >> >> >> >> package tests; >> >> import org.asteriskjava.live.AsteriskChannel; >> import org.asteriskjava.live.LiveException; >> import org.asteriskjava.live.OriginateCallback; >> >> public class myCallbackHandler implements OriginateCallback{ >> >> >> public String reference; >> >> public myCallbackHandler(String reference){ >> System.out.println("myCallbackHandler for reference "+reference+" >> just instantiated."); >> this.reference = reference; >> } >> >> public void onDialing(AsteriskChannel ac) >> { >> System.out.println("myCallbackHandler for reference "+reference+" >> receives state: Dialling, channelID is: "+ac.getId()+", State is: >> "+ac.getState()); >> >> String channelID=ac.getId(); >> } >> >> public void onBusy(AsteriskChannel ac) >> { >> System.out.println("myCallbackHandler for reference "+reference+" >> receives state: Busy, channelID is: "+ac.getId()+", State is: >> "+ac.getState()); >> } >> >> public void onFailure(LiveException le) >> { >> System.out.println("myCallbackHandler for reference "+reference+" >> receives state: Failure "+le.getMessage()); >> } >> >> public void onNoAnswer(AsteriskChannel ac) >> { >> System.out.println("myCallbackHandler for reference "+reference+" >> receives state: No Answer, channelID is: "+ac.getId()+", State is: >> "+ac.getState()); >> } >> >> public void onSuccess(AsteriskChannel ac) >> { >> System.out.println("myCallbackHandler for reference "+reference+" >> receives state: Success, channelID is: "+ac.getId()+", State is: >> "+ac.getState()); >> } >> >> } >> >> >> regards, >> yves >> >> >> Am 06.03.2013 04:57, schrieb roko: >> >> Hi >> >> I use the SendActionCallback, but I'm getting the same response that I >> get from the blocking function... no new data. So, how can I get the value >> of the ORIGINATE_STATUS variable ? >> >> E. >> >> ------------------------------ >> *De:* roko <ro...@ya...> <ro...@ya...> >> *Para:* "ast...@li..."<ast...@li...> >> <ast...@li...><ast...@li...> >> *Enviado:* Lunes, 4 de marzo, 2013 10:38 A.M. >> *Asunto:* Re: [Asterisk-java-users] How to get ORIGINATE_STATUS value >> after OriginateAction >> >> Hi >> >> Thx for your answer. Do you mean instead of blocking using: >> >> ManagerResponse<http://www.asterisk-java.org/development/apidocs/org/asteriskjava/manager/response/ManagerResponse.html> >> sendAction(ManagerAction<http://www.asterisk-java.org/development/apidocs/org/asteriskjava/manager/action/ManagerAction.html> action, >> long timeout) >> >> Should I use this function ?: >> >> void sendAction(ManagerAction<http://www.asterisk-java.org/development/apidocs/org/asteriskjava/manager/action/ManagerAction.html> action, >> SendActionCallback<http://www.asterisk-java.org/development/apidocs/org/asteriskjava/manager/SendActionCallback.html> >> callback) >> >> I see in the docs that I still get a ManagerResponse<http://www.asterisk-java.org/development/apidocs/org/asteriskjava/manager/response/ManagerResponse.html>. >> Pls forgive me, I'm very new at this. How can I get the ORIGINATE_STATUS >> from the ManagerResponse object ? Do you have an example that I could use >> ? Thx for your help. >> >> E. >> >> ------------------------------ >> *De:* Yves A. <yv...@gm...> <yv...@gm...> >> *Para:* ast...@li... >> *Enviado:* Lunes, 4 de marzo, 2013 2:45 A.M. >> *Asunto:* Re: [Asterisk-java-users] How to get ORIGINATE_STATUS value >> after OriginateAction >> >> Hi, >> >> you could use a callback handler. this way you´ll get informed about any >> state change. >> >> yves >> >> Am 04.03.2013 04:06, schrieb roko: >> >> Hi everyone >> >> I'm just starting with asterisk and asterisk-java, so please forgive me >> if this is a silly question. Here >> (http://www.voip-info.org/wiki/view/Asterisk+cmd+Originate)<http://www.voip-info.org/wiki/view/Asterisk+cmd+Originate>I can see that the originate cmd sets the ORIGINATE_STATUS variable before >> exiting. How can I get this value from asterisk-java ? At this point I'm >> using the code from the tutorial, like this: >> >> OriginateAction originateAction; >> ManagerResponse originateResponse; >> >> originateAction = new OriginateAction(); >> originateAction.setChannel("SIP/John"); >> originateAction.setContext("default"); >> originateAction.setExten("1300"); >> originateAction.setPriority(new Integer(1)); >> originateAction.setTimeout(new Integer(30000)); >> >> managerConnection.login(); >> originateResponse = managerConnection.sendAction(originateAction, 30000); >> >> Thx for your help. >> >> E. >> >> >> ------------------------------------------------------------------------------ >> Everyone hates slow websites. So do we. >> Make your web apps faster with AppDynamics >> Download AppDynamics Lite for free today:http://p.sf.net/sfu/appdyn_d2d_feb >> >> >> >> _______________________________________________ >> Asterisk-java-users mailing lis...@li...https://lists.sourceforge.net/lists/listinfo/asterisk-java-users >> >> >> >> >> ------------------------------------------------------------------------------ >> Everyone hates slow websites. So do we. >> Make your web apps faster with AppDynamics >> Download AppDynamics Lite for free today: >> http://p.sf.net/sfu/appdyn_d2d_feb >> _______________________________________________ >> Asterisk-java-users mailing list >> Ast...@li... >> https://lists.sourceforge.net/lists/listinfo/asterisk-java-users >> >> >> >> >> ------------------------------------------------------------------------------ >> Everyone hates slow websites. So do we. >> Make your web apps faster with AppDynamics >> Download AppDynamics Lite for free today: >> http://p.sf.net/sfu/appdyn_d2d_feb >> _______________________________________________ >> Asterisk-java-users mailing list >> Ast...@li... >> https://lists.sourceforge.net/lists/listinfo/asterisk-java-users >> >> >> >> >> ------------------------------------------------------------------------------ >> Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester >> Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the >> endpoint security space. For insight on selecting the right partner to >> tackle endpoint security challenges, access the full report. http://p.sf.net/sfu/symantec-dev2dev >> >> >> >> _______________________________________________ >> Asterisk-java-users mailing lis...@li...https://lists.sourceforge.net/lists/listinfo/asterisk-java-users >> >> >> >> >> ------------------------------------------------------------------------------ >> Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester >> Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the >> endpoint security space. For insight on selecting the right partner to >> tackle endpoint security challenges, access the full report. >> http://p.sf.net/sfu/symantec-dev2dev >> _______________________________________________ >> Asterisk-java-users mailing list >> Ast...@li... >> https://lists.sourceforge.net/lists/listinfo/asterisk-java-users >> >> > > > -- > משיח NOW! > Moshiach is coming very soon, prepare yourself! > יחי אדוננו מורינו ורבינו מלך המשיח לעולם ועד! > > > ------------------------------------------------------------------------------ > Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester > Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the > endpoint security space. For insight on selecting the right partner to > tackle endpoint security challenges, access the full report. http://p.sf.net/sfu/symantec-dev2dev > > > > _______________________________________________ > Asterisk-java-users mailing lis...@li...https://lists.sourceforge.net/lists/listinfo/asterisk-java-users > > > > > ------------------------------------------------------------------------------ > Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester > Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the > endpoint security space. For insight on selecting the right partner to > tackle endpoint security challenges, access the full report. > http://p.sf.net/sfu/symantec-dev2dev > _______________________________________________ > Asterisk-java-users mailing list > Ast...@li... > https://lists.sourceforge.net/lists/listinfo/asterisk-java-users > > -- משיח NOW! Moshiach is coming very soon, prepare yourself! יחי אדוננו מורינו ורבינו מלך המשיח לעולם ועד! |