/*
* This file is part of MazeSolver.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (c) 2014 MazeSolver
* Sergio M. Afonso Fumero <theSkatrak@gmail.com>
* Kevin I. Robayna Hernández <kevinirobaynahdez@gmail.com>
*/
/**
* @file BlackboardManager.java
* @date 24/12/2014
*/
package es.ull.mazesolver.util;
import java.util.HashMap;
/**
* Clase que gestiona el sistema de pizarras por canales utilizado por los
* entornos para permitir la compartición de las pizarras sólo a subconjuntos de
* agentes.
*/
public class BlackboardManager {
private HashMap <String, Object> m_blackboards;
/**
* Inicializa el gestor de pizarras.
*/
public BlackboardManager () {
m_blackboards = new HashMap <String, Object>();
}
/**
* Obtiene la pizarra que hay en el canal indicado.
*
* @param channel
* Canal del que se quiere obtener la pizarra.
* @return El objeto pizarra del canal.
*/
public Object getBlackboard (String channel) {
return m_blackboards.get(channel);
}
/**
* Añade una nueva pizarra al gestor.
*
* @param blackboard
* Objeto que representa la nueva pizarra. Las modificaciones
* realizadas a este objeto son visibles para todos los agentes que
* posean una referencia a la misma.
* @return El nombre del nuevo canal donde se ha colocado la pizarra.
*/
public String addBlackboard (Object blackboard) {
String name = "";
do {
name = Long.toUnsignedString(((Double) (Math.random() * Long.MAX_VALUE)).longValue());
}
while (m_blackboards.containsKey(name));
m_blackboards.put(name, blackboard);
return name;
}
/**
* Intenta añadir la pizarra al canal deseado. Esto será posible sólo si el
* canal no está ya ocupado.
*
* @param blackboard
* Objeto que representa la pizarra.
* @param desired_channel
* Canal donde se quiere colocar la pizarra.
* @return Canal donde finalmente se ha colocado la pizarra.
*/
public String addBlackboard (Object blackboard, String desired_channel) {
if (!m_blackboards.containsKey(desired_channel)) {
m_blackboards.put(desired_channel, blackboard);
return desired_channel;
}
else
return addBlackboard(blackboard);
}
/**
* Cambia el objeto pizarra asociado a un canal ya creado.
*
* @param channel
* Canal en el que modificar la pizarra.
* @param blackboard
* Nueva pizarra que colocar en el canal.
* @return {@code true} si se ha realizado el cambio y {@code false} si el
* canal indicado no existía.
*/
public boolean changeBlackboard (String channel, Object blackboard) {
if (m_blackboards.containsKey(channel)) {
m_blackboards.put(channel, blackboard);
return true;
}
return false;
}
/**
* Elimina un canal del gestor de pizarras.
*
* @param channel
* Canal que eliminar.
* @return {@code true} si se ha realizado la eliminación y {@code false} si
* el canal indicado no existía.
*/
public boolean removeBlackboard (String channel) {
if (m_blackboards.containsKey(channel)) {
m_blackboards.remove(channel);
return true;
}
return false;
}
/**
* Indica si un canal está ocupado.
*
* @param channel
* Canal que consultar.
* @return Si el canal consultado existe para este gestor.
*/
boolean channelUsed (String channel) {
return m_blackboards.containsKey(channel);
}
}