Receive accidents through NotificationIRP in OSS

  • Tutorial
Hello. In a previous publication , a method for obtaining active alarms via AlarmIRP was considered. Next, consider how to get alarm messages as they appear using NotificationIRP. In the example, we will use Nokia's NetAct.

In comparison with AlarmIRP, the interface considered in this article will require us, in addition to creating a CORBA client, to also create a CORBA server, which will process messages coming from NotificationIRP. This “server”, among other things, should implement the push_structured_events method to which the OSS will transmit the events in the form of StructuredEvent [] . For this we need the following class:

privateclassIRPManagerextendsorg.omg.CosNotifyComm.SequencePushConsumerPOA{
	@Overridepublicvoidpush_structured_events(StructuredEvent[] notifications)throws org.omg.CosEventComm.Disconnected {
		for (StructuredEvent alarm: notifications) {
			alarmPrint(alarm);
		}
	}
	@Overridepublicvoidoffer_change(EventType[] arg0, EventType[] arg1)throws org.omg.CosNotifyComm.InvalidEventType {
		System.out.println("Offer Change!");
	}
	@Overridepublicvoiddisconnect_sequence_push_consumer(){
		System.out.println("Disconnected!");
	}
}

The alarmPrint method is similar to the one from the previous article. At the end, the complete code of the entire project will be attached.

Now you need to "wrap" this class with the functionality of the ORB server, get NotificationIRP and pass it a link to the received object.

_irpMan = new IRPManager();
_notificationOrb = ORB.init(new String[0], null);
org.omg.CORBA.ORB orb = ORB.init(new String[0], null);
org.omg.CORBA.Object rootObj = orb.string_to_object(readIOR());
_notifIrp = com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.NotificationIRPHelper.narrow(rootObj);
POA poa;
poa = POAHelper.narrow(_notificationOrb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
_notifySrvr = poa.servant_to_reference(_irpMan);
_notifyServer = _notificationOrb.object_to_string(_notifySrvr);
//получили ссылку на наш сервер
String[] aCat = _notifIrp.get_notification_categories(new NotificationTypesSetHolder());
StringTypeOpt alarmFltr = new StringTypeOpt();
alarmFltr.value(alarmFilter);
//подписываемся на уведомления
_attId = _notifIrp.attach_push(_notifyServer, timetick, aCat, alarmFltr, "");
//запуск ORB в подпроцессе
(new notificationThread()).start();

To run the ORB, we will use a subprocess:
privateclassnotificationThreadextendsThread{
	publicvoidrun(){
		_notificationOrb.run();
		}
}

OSS will stop sending us notifications after a timetick time has elapsed , or until we refuse it by calling the detach method . If we need to receive messages after the timer expires, we need to inform the system using the get_subscription_status method . When you call it, the timer will start counting again.
It remains to collect everything together, find the required libraries in NetAct and connect to the virtual machine on which the nbi3gc server is running (since the IOR in this example is read from the file). To run the proposed example, we will use the command:
java -cp.: jacorb-3.1.jar: jacorb-services-3.1.jar: nbi3gc-internal-corba-interface-17.8.0.158.jar AlarmClient

Under the spoiler, the full code of the example
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.omg.CORBA.IntHolder;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNotification.EventType;
import org.omg.CosNotification.Property;
import org.omg.CosNotification.StructuredEvent;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;
import org.omg.TimeBase.UtcT;
import org.omg.TimeBase.UtcTHelper;
import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPConstDefs.StringTypeOpt;
import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPConstDefs.StringTypeOptHolder;
import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPSystem.InvalidParameter;
import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPSystem.OperationNotSupported;
import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPSystem.ParameterNotSupported;
import com.nsn.oss.nbi.internal.corba.NotificationIRPConstDefs.NotificationTypesSetHolder;
import com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.GetNotificationCategories;
publicclassAlarmClient{
	private com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.NotificationIRP _notifIrp = null;
	public String alarmFilter ="";
	privatefinallong UNIX_OFFSET = 122192928000000000L;
	public String delimiter = ";";
	private org.omg.CORBA.ORB _notificationOrb = null;
	private String _notifyServer = null;
	private org.omg.CORBA.Object _notifySrvr = null;
	private String _attId = "";
	private IRPManager _irpMan = null;
	publicint timetick = 15;
	publicstaticvoidmain(String[] args){
		AlarmClient ac = new AlarmClient();
		ac.startNotifications();
		try {
			Thread.sleep(20000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		ac.stopNotifications();
	}
	private String readIOR(String iorType){
        File f = new File("/d/oss/global/var/NSN-nbi3gc/ior/NotificationIRP.ior");
        BufferedReader br;
        String iorContents = null;
		try {
			br = new BufferedReader(new FileReader(f));
	        iorContents = br.readLine();
	        br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
        return iorContents;
	}
	privatevoidalarmPrint(StructuredEvent alarm){
		String result = "";
		UtcT timeValue = null;
		Date dt;
		DateFormat df;
		if (alarm.filterable_data != null) {
			for (Property filterableData: alarm.filterable_data) {
				String fieldName = filterableData.name;
				switch (fieldName){
				case"b":
					timeValue = UtcTHelper.extract(filterableData.value);
					dt = new Date((timeValue.time - UNIX_OFFSET) / 10000);
					df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
					result = result + df.format(dt) + delimiter;
					break;
				case"e":
					result = result + filterableData.value.extract_string() + delimiter;
					break;
				case"i":
					result = result + filterableData.value.extract_string() + delimiter;
					break;
				}
			}
		}
			System.out.println(result);
	}
	publicvoidstartNotifications(){
		_irpMan = new IRPManager();
		_notificationOrb = ORB.init(new String[0], null);
		org.omg.CORBA.ORB orb = ORB.init(new String[0], null);
		org.omg.CORBA.Object rootObj = orb.string_to_object(readIOR("NotificationIRP"));
		_notifIrp = com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.NotificationIRPHelper.narrow(rootObj);
		POA poa;
		try {
			poa = POAHelper.narrow(_notificationOrb.resolve_initial_references("RootPOA"));
		poa.the_POAManager().activate();
		_notifySrvr = poa.servant_to_reference(_irpMan);
		_notifyServer = _notificationOrb.object_to_string(_notifySrvr);
		String[] aCat = _notifIrp.get_notification_categories(new NotificationTypesSetHolder());
		StringTypeOpt alarmFltr = new StringTypeOpt();
		alarmFltr.value(alarmFilter);
		_attId = _notifIrp.attach_push(_notifyServer, timetick, aCat, alarmFltr, "");
		(new notificationThread()).start();
		} catch (InvalidName | AdapterInactive | ParameterNotSupported | 
				com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.AtLeastOneNotificationCategoryNotSupported | 
				InvalidParameter | com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.Attach | 
				com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.AlreadySubscribed | ServantNotActive |
				WrongPolicy | GetNotificationCategories | OperationNotSupported e) {
			e.printStackTrace();
		}
	}
	publicvoidstopNotifications(){
		try {
			_notifIrp.detach(_notifyServer, _attId);
			_notificationOrb.shutdown(true);
		} catch (com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.DetachException | ParameterNotSupported
				| InvalidParameter e) {
			e.printStackTrace();
		}
	}
	publicintrenewSubscription(){
		com.nsn.oss.nbi.internal.corba.NotificationIRPConstDefs.SubscriptionStateHolder arg2 = new com.nsn.oss.nbi.internal.corba.NotificationIRPConstDefs.SubscriptionStateHolder();
		IntHolder arg3 = new IntHolder();
		StringTypeOptHolder arg1 = new StringTypeOptHolder();
		arg1.value.value(alarmFilter);
		try {
			_notifIrp.get_subscription_status(_attId, arg1, arg2, arg3);
		} catch (InvalidParameter | com.nsn.oss.nbi.internal.corba.ManagedGenericIRPSystem.OperationNotSupported
				| com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.GetSubscriptionStatus e) {
			e.printStackTrace();
		}
		return arg2.value.value();
	}
	privateclassIRPManagerextendsorg.omg.CosNotifyComm.SequencePushConsumerPOA{
		@Overridepublicvoidpush_structured_events(StructuredEvent[] notifications)throws org.omg.CosEventComm.Disconnected {
			for (StructuredEvent alarm: notifications) {
				alarmPrint(alarm);
			}
		}
		@Overridepublicvoidoffer_change(EventType[] arg0, EventType[] arg1)throws org.omg.CosNotifyComm.InvalidEventType {
			System.out.println("Offer Change!");
		}
		@Overridepublicvoiddisconnect_sequence_push_consumer(){
			System.out.println("Disconnected!");
		}
	}
	privateclassnotificationThreadextendsThread{
		publicvoidrun(){
			_notificationOrb.run();
			}
	}
}

Thanks for attention. It turned out briefly, but, in my opinion, the main points are considered, I hope this information will be useful. Questions and comments are welcome.

Also popular now: