/* * Copyright (c) 2016 TethrNet Technology Co.Ltd and others. All rights reserved. * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.tsdr.syslogs.server.datastore; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.tsdr.syslog.collector.rev151007.SyslogDispatcher; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.tsdr.syslog.collector.rev151007.syslog.dispatcher.SyslogListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.tsdr.syslog.collector.rev151007.syslog.dispatcher.SyslogListenerKey; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; /** * This RegisteredListener handles the listening and notification * handling of each registered filter * * @author Wei Lai(weilai@tethrnet.com) */ public class RegisteredListener implements DataChangeListener { private DataBroker db; private final Logger LOG = LoggerFactory.getLogger(RegisteredListener.class); private String listenerId; private String callBackUrl; private ListenerRegistration<DataChangeListener> listener; private OutputStreamWriter out; private BufferedReader responseReader; public RegisteredListener(DataBroker db, String listenerId, String url) { this.db = db; this.listenerId = listenerId; this.callBackUrl = url; } private InstanceIdentifier<SyslogListener> toInstanceIdentifier(String listenerId) { InstanceIdentifier<SyslogListener> iid = InstanceIdentifier.create(SyslogDispatcher.class) .child(SyslogListener.class, new SyslogListenerKey(listenerId)); return iid; } /** * monitor the listener node in operational tree */ public void listen() { InstanceIdentifier<SyslogListener> iid = this.toInstanceIdentifier(this.listenerId); this.listener = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, iid, this, AsyncDataBroker.DataChangeScope.SUBTREE); } /** * close the listener registration */ public boolean close() { try { this.listener.close(); } catch (Exception e) { LOG.error("unable to close listener"); return false; } return true; } /** * generate notification when Syslog message match certain filter and sent it to the corresponding client */ @Override public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) { InstanceIdentifier<SyslogListener> iid = this.toInstanceIdentifier(this.listenerId); SyslogListener listener = (SyslogListener) change.getUpdatedData().get(iid); if (listener != null) { LOG.info(" get updated message from: " + listener.getListenerId()); LOG.info(" the updated message is: " + listener.getSyslogMessage()); if (this.callBackUrl != null) { try { URL url = new URL(callBackUrl); URLConnection urlConnection = url.openConnection(); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.setRequestProperty("content-type", "application/x-www-form-urlencoded"); out = new OutputStreamWriter(urlConnection.getOutputStream()); out.write("received updated message " + listener.getSyslogMessage()); out.flush(); int responseCode = ((HttpURLConnection) urlConnection).getResponseCode(); if (HttpURLConnection.HTTP_OK == responseCode) { String readLine; responseReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); while ((readLine = responseReader.readLine()) != null) { LOG.info("the updated message is: " + readLine); } } } catch (IOException e) { LOG.error("connection refused"); } finally { try { out.close(); responseReader.close(); } catch (IOException e) { LOG.error("unable to close the stream"); } } } } } }