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:

private class IRPManager extends org.omg.CosNotifyComm.SequencePushConsumerPOA{
	@Override
	public void push_structured_events(StructuredEvent[] notifications) throws org.omg.CosEventComm.Disconnected {
		for (StructuredEvent alarm: notifications) {
			alarmPrint(alarm);
		}
	}
	@Override
	public void offer_change(EventType[] arg0, EventType[] arg1) throws org.omg.CosNotifyComm.InvalidEventType {
		System.out.println("Offer Change!");
	}
	@Override
	public void disconnect_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:
private class notificationThread extends Thread {
	public void run() {
		_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;
public class AlarmClient {
	private com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.NotificationIRP _notifIrp = null;
	public String alarmFilter ="";
	private final long 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;
	public int timetick = 15;
	public static void main(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;
	}
	private void alarmPrint(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);
	}
	public void startNotifications(){
		_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();
		}
	}
	public void stopNotifications() {
		try {
			_notifIrp.detach(_notifyServer, _attId);
			_notificationOrb.shutdown(true);
		} catch (com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.DetachException | ParameterNotSupported
				| InvalidParameter e) {
			e.printStackTrace();
		}
	}
	public int renewSubscription() {
		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();
	}
	private class IRPManager extends org.omg.CosNotifyComm.SequencePushConsumerPOA{
		@Override
		public void push_structured_events(StructuredEvent[] notifications) throws org.omg.CosEventComm.Disconnected {
			for (StructuredEvent alarm: notifications) {
				alarmPrint(alarm);
			}
		}
		@Override
		public void offer_change(EventType[] arg0, EventType[] arg1) throws org.omg.CosNotifyComm.InvalidEventType {
			System.out.println("Offer Change!");
		}
		@Override
		public void disconnect_sequence_push_consumer() {
			System.out.println("Disconnected!");
		}
	}
	private class notificationThread extends Thread {
		public void run() {
			_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: