org.opennaas.extensions.protocols.netconf.NetconfProtocolSession.java Source code

Java tutorial

Introduction

Here is the source code for org.opennaas.extensions.protocols.netconf.NetconfProtocolSession.java

Source

package org.opennaas.extensions.protocols.netconf;

/*
 * #%L
 * OpenNaaS :: Protocol :: Netconf
 * %%
 * Copyright (C) 2007 - 2014 Fundaci Privada i2CAT, Internet i Innovaci a Catalunya
 * %%
 * 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.
 * #L%
 */

import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;

import net.i2cat.netconf.NetconfSession;
import net.i2cat.netconf.SessionContext;
import net.i2cat.netconf.errors.NetconfProtocolException;
import net.i2cat.netconf.errors.TransportException;
import net.i2cat.netconf.errors.TransportNotRegisteredException;
import net.i2cat.netconf.rpc.Query;
import net.i2cat.netconf.rpc.RPCElement;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opennaas.core.resources.protocol.IProtocolMessageFilter;
import org.opennaas.core.resources.protocol.IProtocolSession;
import org.opennaas.core.resources.protocol.IProtocolSessionListener;
import org.opennaas.core.resources.protocol.ProtocolException;
import org.opennaas.core.resources.protocol.ProtocolSessionContext;

public class NetconfProtocolSession implements IProtocolSession {

    /** The logger **/
    Log log = LogFactory.getLog(NetconfProtocolSession.class);

    /**
     * Contains information about the protocol capability configuration: transport, host, port, ...
     **/
    private ProtocolSessionContext protocolSessionContext = null;
    private String sessionID = null;
    private Status status = null;
    private NetconfSession netconfSession = null;

    private Map<String, IProtocolSessionListener> protocolListeners = null;
    private Map<String, IProtocolMessageFilter> protocolMessageFilters = null;

    public NetconfProtocolSession(ProtocolSessionContext protocolSessionContext, String sessionID)
            throws ProtocolException {

        this.protocolListeners = new HashMap<String, IProtocolSessionListener>();
        this.protocolMessageFilters = new HashMap<String, IProtocolMessageFilter>();

        this.protocolSessionContext = protocolSessionContext;
        this.sessionID = sessionID;
        this.status = Status.DISCONNECTED_BY_USER;

        try {

            SessionContext context = new SessionContext();

            String authType = (String) protocolSessionContext.getSessionParameters()
                    .get(ProtocolSessionContext.AUTH_TYPE);

            SessionContext.AuthType authentication = SessionContext.AuthType.getByValue(authType);
            String uri = (String) protocolSessionContext.getSessionParameters()
                    .get(ProtocolSessionContext.PROTOCOL_URI);

            if ((uri == null) || (uri.length() == 0)) {
                throw new ProtocolException("Mantychore protocols NETCONF: Couldn't get "
                        + ProtocolSessionContext.PROTOCOL_URI + " from protocolSessionContext.");
            }

            context.setURI(new URI(uri));

            if (authentication.equals(SessionContext.AuthType.PASSWORD)) {
                context.setAuthenticationType(SessionContext.AuthType.PASSWORD);

                // store username and password in the uri, as required by netconf4j
                String userName = (String) protocolSessionContext.getSessionParameters()
                        .get(ProtocolSessionContext.USERNAME);
                String password = (String) protocolSessionContext.getSessionParameters()
                        .get(ProtocolSessionContext.PASSWORD);

                String userInfo = userName + ":" + password;
                URI uri1 = new URI(uri);
                URI uri2 = new URI(uri1.getScheme(), userInfo, uri1.getHost(), uri1.getPort(), uri1.getPath(),
                        uri1.getQuery(), uri1.getFragment());

                context.setURI(uri2);
            }

            else if (authentication.equals(SessionContext.AuthType.PUBLICKEY)) {

                String keyURI = (String) protocolSessionContext.getSessionParameters()
                        .get(ProtocolSessionContext.KEY_PATH);
                if ((keyURI == null) || (keyURI.length() == 0)) {
                    throw new ProtocolException("Mantychore protocols NETCONF: Couldn't get "
                            + ProtocolSessionContext.AUTH_TYPE + "from protocolSessionContext.");
                }

                context.setKeyUsername((String) protocolSessionContext.getSessionParameters()
                        .get(ProtocolSessionContext.KEY_USERNAME));
                context.setKeyPassword((String) protocolSessionContext.getSessionParameters()
                        .get(ProtocolSessionContext.KEY_PASSPHRASE));
                context.setKeyLocation((String) protocolSessionContext.getSessionParameters()
                        .get(ProtocolSessionContext.KEY_PATH));
                context.setAuthenticationType(SessionContext.AuthType.PUBLICKEY);

            } else {
                throw new ProtocolException("Authentication Error: Invalid authentication type.");
            }

            netconfSession = new NetconfSession(context);

        } catch (URISyntaxException e) {
            log.error("Error with the syntaxis");
            throw new ProtocolException("Error with the syntaxis" + e.getMessage(), e);
        } catch (TransportNotRegisteredException e) {
            log.error("Error with the transport initialization");
            throw new ProtocolException("Error with the transport initialization" + e.getMessage(), e);
        } catch (ConfigurationException e) {
            log.error("Configuration error");
            throw new ProtocolException("Configuration error: " + e.getMessage(), e);
        }
    }

    @Override
    public void asyncSend(Object requestMessage) throws ProtocolException {
        // Send a message to the device, and don't wait for the response
        RPCElement rpcReply = null;
        try {
            Query rpcQuery = (Query) requestMessage;
            netconfSession.sendAsyncQuery(rpcQuery);
        } catch (Exception ex) {
            throw new ProtocolException(ex);
        }

    }

    @Override
    public Object sendReceive(Object requestMessage) throws ProtocolException {
        // Send a message to the device, and wait for the response
        RPCElement rpcReply = null;
        try {
            Query rpcQuery = (Query) requestMessage;
            rpcReply = netconfSession.sendSyncQuery(rpcQuery);
        } catch (Exception ex) {
            throw new ProtocolException(ex);
        }
        return rpcReply;
    }

    @Override
    public void connect() throws ProtocolException {

        if (status.equals(Status.CONNECTED)) {
            throw new ProtocolException("Cannot connect because the session is already connected");
        }
        // Start the receiver thread it will continuously get and parse the
        // messages from the communication channel
        log.info("Connecting to the device");
        try {
            netconfSession.connect();
            status = Status.CONNECTED;
            // log.info("Status " + status.toString());
        } catch (TransportException e) {
            ProtocolException te = new ProtocolException("TransportException: " + e.getMessage());
            te.initCause(e);
            throw te;
        } catch (NetconfProtocolException e) {
            ProtocolException te = new ProtocolException("NetconfProtocolException: " + e.getMessage());
            te.initCause(e);
            throw te;
        }
    }

    @Override
    public void disconnect() throws ProtocolException {

        if (!status.equals(Status.CONNECTED)) {
            throw new ProtocolException(
                    "Cannot disconnect because the session is already disconnected. Current state: " + status);
        }

        netconfSession.disconnect();
        status = Status.DISCONNECTED_BY_USER;

        log.info("Protocol session stopped");
    }

    @Override
    public ProtocolSessionContext getSessionContext() {

        return protocolSessionContext;
    }

    @Override
    public String getSessionId() {
        return sessionID;
    }

    @Override
    public Status getStatus() {

        return status;
    }

    @Override
    public void registerProtocolSessionListener(IProtocolSessionListener protocolSessionListener,
            IProtocolMessageFilter protocolMessageFilter, String idListener) {
        protocolMessageFilters.put(idListener, protocolMessageFilter);
        protocolListeners.put(idListener, protocolSessionListener);

    }

    @Override
    public void unregisterProtocolSessionListener(IProtocolSessionListener protocolSessionListener,
            String idListener) {
        protocolMessageFilters.remove(idListener);
        protocolListeners.remove(idListener);

    }

    @Override
    public void setSessionContext(ProtocolSessionContext context) {
        this.protocolSessionContext = context;
    }

    @Override
    public void setSessionId(String sessionId) {
        this.sessionID = sessionId;
    }
}