/* * Created on Nov 26, 2005 * * Copyright 2005 CafeSip.org * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.cafesip.sipexchange.inservice.server; import java.util.Iterator; import java.util.StringTokenizer; import javax.management.MBeanServer; import org.cafesip.sipexchange.inservice.shared.CalledAddressTermTrigger; import org.cafesip.sipexchange.inservice.shared.ContinueResponse; import org.cafesip.sipexchange.inservice.shared.Domain; import org.cafesip.sipexchange.inservice.shared.DomainTriggerParamParser; import org.cafesip.sipexchange.inservice.shared.RerouteResponse; import org.cafesip.sipexchange.inservice.shared.Response; import org.cafesip.sipexchange.inservice.shared.Subscriber; import org.cafesip.sipexchange.inservice.shared.TerminateResponse; import org.cafesip.sipexchange.inservice.shared.Trigger; import org.cafesip.sipexchange.inservice.shared.TriggerInfo; import org.jboss.remoting.InvocationRequest; import org.jboss.remoting.ServerInvocationHandler; import org.jboss.remoting.ServerInvoker; import org.jboss.remoting.callback.InvokerCallbackHandler; /** * @author Amit Chatterjee * */ public class InServiceHandler implements ServerInvocationHandler { /** * A constructor for this class. * * */ public InServiceHandler() { super(); } /* * @see org.jboss.remoting.ServerInvocationHandler#setMBeanServer(javax.management.MBeanServer) */ public void setMBeanServer(MBeanServer arg0) { } /* * @see org.jboss.remoting.ServerInvocationHandler#setInvoker(org.jboss.remoting.ServerInvoker) */ public void setInvoker(ServerInvoker arg0) { } /* * @see org.jboss.remoting.ServerInvocationHandler#invoke(org.jboss.remoting.InvocationRequest) */ public Object invoke(InvocationRequest req) throws Throwable { TriggerInfo t = (TriggerInfo) req.getParameter(); System.out.println("Received an invoke from a client\n" + printTriggerInfo(t)); String param = (String) t.getParam(); if (t instanceof CalledAddressTermTrigger) { param = DomainTriggerParamParser.parse(param).getParam(); } if (param == null) { return terminate("We are unable to process the call at this time because no params are present"); } return processRequest(param); } private Response processRequest(String param) { StringTokenizer tokens = new StringTokenizer(param, "="); if (tokens.countTokens() < 2) { return terminate("An error occured while processing the call - invalid param " + param); } String action = tokens.nextToken(); String aparam = tokens.nextToken(); if (action.equals("disconnect") == true) { System.out.println("Sending terminate response with reason " + aparam); return terminate(aparam); } if (action.equals("continue") == true) { System.out.println("Sending a continue response"); return new ContinueResponse(); } if (action.equals("forward") == true) { RerouteResponse r = new RerouteResponse(); StringTokenizer addresses = new StringTokenizer(aparam, ";"); int count = addresses.countTokens(); String[] addr = new String[count]; for (int i = 0; i < count; i++) { String address = addresses.nextToken(); addr[i] = address; } System.out.println("Sending a forward response with address " + aparam); r.setRerouteAddresses(addr); return r; } if (action.equals("reroute") == true) { System.out.println("Sending a redirect response with address " + aparam); RerouteResponse r = new RerouteResponse(); r.setRedirect(true); String[] addr = new String[1]; addr[0] = aparam; r.setRerouteAddresses(addr); return r; } return terminate("An error occured while processing the call - invalid actions"); } private Response terminate(String reason) { TerminateResponse response = new TerminateResponse(); response.setStatusCode(603); response.setReason(reason); return response; } /* * @see org.jboss.remoting.ServerInvocationHandler#addListener(org.jboss.remoting.callback.InvokerCallbackHandler) */ public void addListener(InvokerCallbackHandler arg0) { } /* * @see org.jboss.remoting.ServerInvocationHandler#removeListener(org.jboss.remoting.callback.InvokerCallbackHandler) */ public void removeListener(InvokerCallbackHandler arg0) { } private String printTriggerInfo(TriggerInfo trigger) { StringBuffer buffer = new StringBuffer("Trigger Info:\n"); buffer.append("Trigger type: " + trigger.getClass().getName() + "\n"); buffer.append(" Feature: " + trigger.getFeature() + "\n"); Domain calling_domain = trigger.getCallingDomain(); if (calling_domain != null) { buffer.append(" The calling user is from a known domain - " + calling_domain.getName() + "\n"); Iterator i = calling_domain.getTriggers().iterator(); while (i.hasNext() == true) { Trigger t = (Trigger) i.next(); buffer.append(" TriggerInfo: " + t.getTriggerType() + " Feature: " + t.getFeature() + "\n"); } } Subscriber calling_subscriber = trigger.getCallingSubscriber(); if (calling_subscriber != null) { buffer.append(" The calling user is a subscriber - " + calling_subscriber.getUserid() + "\n"); Iterator i = calling_subscriber.getTriggers().iterator(); while (i.hasNext() == true) { Trigger t = (Trigger) i.next(); buffer.append(" TriggerInfo: " + t.getTriggerType() + " Feature: " + t.getFeature() + "\n"); } } Domain called_domain = trigger.getCalledDomain(); if (called_domain != null) { buffer.append(" The called user is from a known domain - " + called_domain.getName() + "\n"); Iterator i = called_domain.getTriggers().iterator(); while (i.hasNext() == true) { Trigger t = (Trigger) i.next(); buffer.append(" TriggerInfo: " + t.getTriggerType() + " Feature: " + t.getFeature() + "\n"); } } Subscriber called_subscriber = trigger.getCalledSubscriber(); if (called_subscriber != null) { buffer.append(" The called user is a subscriber - " + called_subscriber.getUserid() + "\n"); Iterator i = called_subscriber.getTriggers().iterator(); while (i.hasNext() == true) { Trigger t = (Trigger) i.next(); buffer.append(" TriggerInfo: " + t.getTriggerType() + " Feature: " + t.getFeature() + "\n"); } } return buffer.toString(); } }