/* * Copyright 2011, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.mobicents.protocols.ss7.cap; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.mobicents.protocols.ss7.cap.api.CAPApplicationContext; import org.mobicents.protocols.ss7.cap.api.CAPDialog; import org.mobicents.protocols.ss7.cap.api.CAPException; import org.mobicents.protocols.ss7.cap.api.CAPParsingComponentException; import org.mobicents.protocols.ss7.cap.api.CAPProvider; import org.mobicents.protocols.ss7.cap.api.CAPServiceBase; import org.mobicents.protocols.ss7.cap.api.CAPServiceListener; import org.mobicents.protocols.ss7.cap.api.errors.CAPErrorMessage; import org.mobicents.protocols.ss7.sccp.parameter.SccpAddress; import org.mobicents.protocols.ss7.tcap.api.TCAPException; import org.mobicents.protocols.ss7.tcap.api.tc.dialog.Dialog; import org.mobicents.protocols.ss7.tcap.asn.comp.ComponentType; import org.mobicents.protocols.ss7.tcap.asn.comp.Invoke; import org.mobicents.protocols.ss7.tcap.asn.comp.OperationCode; import org.mobicents.protocols.ss7.tcap.asn.comp.Parameter; import org.mobicents.protocols.ss7.tcap.asn.comp.Problem; /** * This class must be the super class of all CAP services * * @author sergey vetyutnev * */ public abstract class CAPServiceBaseImpl implements CAPServiceBase { protected Boolean _isActivated = false; protected List<CAPServiceListener> serviceListeners = new CopyOnWriteArrayList<CAPServiceListener>(); protected CAPProviderImpl capProviderImpl = null; protected CAPServiceBaseImpl(CAPProviderImpl capProviderImpl) { this.capProviderImpl = capProviderImpl; } @Override public CAPProvider getCAPProvider() { return this.capProviderImpl; } /** * Creation a CAP Dialog implementation for the specific service * * @param appCntx * @param tcapDialog * @return */ protected abstract CAPDialogImpl createNewDialogIncoming(CAPApplicationContext appCntx, Dialog tcapDialog); /** * Creating new outgoing TCAP Dialog. Used when creating a new outgoing CAP Dialog * * @param origAddress * @param destAddress * @return * @throws CAPException */ protected Dialog createNewTCAPDialog(SccpAddress origAddress, SccpAddress destAddress, Long localTrId) throws CAPException { try { return this.capProviderImpl.getTCAPProvider().getNewDialog(origAddress, destAddress, localTrId); } catch (TCAPException e) { throw new CAPException(e.getMessage(), e); } } public abstract void processComponent(ComponentType compType, OperationCode oc, Parameter parameter, CAPDialog capDialog, Long invokeId, Long linkedId, Invoke linkedInvoke) throws CAPParsingComponentException; /** * Returns a list of linked operations for operCode operation * * @param operCode * @return */ public long[] getLinkedOperationList(long operCode) { return null; } /** * Adding CAP Dialog into CAPProviderImpl.dialogs Used when creating a new outgoing CAP Dialog * * @param dialog */ protected void putCAPDialogIntoCollection(CAPDialogImpl dialog) { this.capProviderImpl.addDialog((CAPDialogImpl) dialog); } protected void addCAPServiceListener(CAPServiceListener capServiceListener) { this.serviceListeners.add(capServiceListener); } protected void removeCAPServiceListener(CAPServiceListener capServiceListener) { this.serviceListeners.remove(capServiceListener); } /** * This method is invoked when CAPProviderImpl.onInvokeTimeOut() is invoked. An InvokeTimeOut may be a normal situation for * the component class 2, 3, or 4. In this case checkInvokeTimeOut() should return true and deliver to the CAP-user correct * indication * * @param dialog * @param invoke * @return */ public boolean checkInvokeTimeOut(CAPDialog dialog, Invoke invoke) { return false; } /** * {@inheritDoc} */ public boolean isActivated() { return this._isActivated; } /** * {@inheritDoc} */ public void acivate() { this._isActivated = true; } /** * {@inheritDoc} */ public void deactivate() { this._isActivated = false; // TODO: abort all active dialogs ? } protected void deliverErrorComponent(CAPDialog capDialog, Long invokeId, CAPErrorMessage capErrorMessage) { for (CAPServiceListener serLis : this.serviceListeners) { serLis.onErrorComponent(capDialog, invokeId, capErrorMessage); } } protected void deliverRejectComponent(CAPDialog capDialog, Long invokeId, Problem problem, boolean isLocalOriginated) { for (CAPServiceListener serLis : this.serviceListeners) { serLis.onRejectComponent(capDialog, invokeId, problem, isLocalOriginated); } } protected void deliverInvokeTimeout(CAPDialog capDialog, Invoke invoke) { for (CAPServiceListener serLis : this.serviceListeners) { serLis.onInvokeTimeout(capDialog, invoke.getInvokeId()); } } }