class OFSwitch implements IOFSwitchBackend {

	@Override
	public boolean hasAnotherMaster() {

		//TODO: refactor get connection to not throw illegal arg exceptions
		IOFConnection mainCxn = this.getConnection(OFAuxId.MAIN);

		if(mainCxn != null) {

			// Determine the local URI
			InetSocketAddress address = (InetSocketAddress) mainCxn.getLocalInetAddress();
			URI localURI = URIUtil.createURI(address.getHostName(), address.getPort());

			for(Entry<URI,Map<OFAuxId, OFBsnControllerConnection>> entry : this.controllerConnections.entrySet()) {

				// Don't check our own controller connections
				URI uri = entry.getKey();
				if(!localURI.equals(uri)){

					// We only care for the MAIN connection
					Map<OFAuxId, OFBsnControllerConnection> cxns = this.controllerConnections.get(uri);
					OFBsnControllerConnection controllerCxn = cxns.get(OFAuxId.MAIN);

					if(controllerCxn != null) {
						// If the controller id disconnected or not master we know it is not connected
						if(controllerCxn.getState() == OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_CONNECTED
								&& controllerCxn.getRole() == OFControllerRole.ROLE_MASTER){
							return true;
						}
					} else {
						log.warn("Unable to find controller connection with aux id "
								+ "MAIN for switch {} on controller with URI {}.",
								this, uri);
					}
				}
			}
		}
		return false;
	}

	public  OFSwitch(IOFConnectionBackend connection, @Nonnull OFFactory factory, @Nonnull IOFSwitchManager switchManager,
			@Nonnull DatapathId datapathId);

}