/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2006-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) 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.
*
* OpenNMS(R) 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 OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.web.svclayer.support;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.opennms.core.utils.WebSecurityUtils;
import org.opennms.netmgt.EventConstants;
import org.opennms.netmgt.dao.CategoryDao;
import org.opennms.netmgt.dao.NodeDao;
import org.opennms.netmgt.model.OnmsCategory;
import org.opennms.netmgt.model.OnmsNode;
import org.opennms.netmgt.model.events.EventBuilder;
import org.opennms.netmgt.model.events.EventProxy;
import org.opennms.netmgt.model.events.EventProxyException;
import org.opennms.netmgt.xml.event.Event;
import org.opennms.web.svclayer.AdminCategoryService;
import org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException;
/**
* <p>DefaultAdminCategoryService class.</p>
*
* @author <a href="mailto:dj@opennms.org">DJ Gregor</a>
* @author <a href="mailto:jeffg@opennms.org">Jeff Gehlbach</a>
* @author <a href="mailto:dj@opennms.org">DJ Gregor</a>
* @author <a href="mailto:jeffg@opennms.org">Jeff Gehlbach</a>
* @version $Id: $
* @since 1.8.1
*/
public class DefaultAdminCategoryService implements
AdminCategoryService {
private CategoryDao m_categoryDao;
private NodeDao m_nodeDao;
private EventProxy m_eventProxy;
/**
* <p>getCategoryDao</p>
*
* @return a {@link org.opennms.netmgt.dao.CategoryDao} object.
*/
public CategoryDao getCategoryDao() {
return m_categoryDao;
}
/**
* <p>setCategoryDao</p>
*
* @param dao a {@link org.opennms.netmgt.dao.CategoryDao} object.
*/
public void setCategoryDao(CategoryDao dao) {
m_categoryDao = dao;
}
/**
* <p>getNodeDao</p>
*
* @return a {@link org.opennms.netmgt.dao.NodeDao} object.
*/
public NodeDao getNodeDao() {
return m_nodeDao;
}
/**
* <p>setNodeDao</p>
*
* @param nodeDao a {@link org.opennms.netmgt.dao.NodeDao} object.
*/
public void setNodeDao(NodeDao nodeDao) {
m_nodeDao = nodeDao;
}
/**
* <p>setEventProxy</p>
*
* @param eventProxy a {@link org.opennms.netmgt.model.events.EventProxy} object.
*/
public void setEventProxy(EventProxy eventProxy) {
m_eventProxy = eventProxy;
}
/** {@inheritDoc} */
public CategoryAndMemberNodes getCategory(String categoryIdString) {
if (categoryIdString == null) {
throw new IllegalArgumentException("categoryIdString must not be null");
}
OnmsCategory category = findCategory(categoryIdString);
final Collection<OnmsNode> memberNodes = new ArrayList<OnmsNode>();
for (final OnmsNode node : getNodeDao().findByCategory(category)) {
if (!"D".equals(node.getType())) {
memberNodes.add(node);
}
}
// XXX does anything need to be initialized in each member node?
return new CategoryAndMemberNodes(category, memberNodes);
}
private OnmsCategory findCategory(String name) {
int categoryId = -1;
try {
categoryId = WebSecurityUtils.safeParseInt(name);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("parameter 'categoryid' "
+ "with value '"
+ name
+ "' could not be parsed "
+ "as an integer");
}
OnmsCategory category = m_categoryDao.get(categoryId);
if (category == null) {
throw new IllegalArgumentException("Could not find category "
+ "with category ID "
+ categoryId);
}
return category;
}
/**
* <p>findAllNodes</p>
*
* @return a {@link java.util.List} object.
*/
public List<OnmsNode> findAllNodes() {
final List<OnmsNode> list = new ArrayList<OnmsNode>();
for (final OnmsNode node : getNodeDao().findAll()) {
if (!"D".equals(node.getType())) {
list.add(node);
}
}
Collections.sort(list);
return list;
}
/** {@inheritDoc} */
public EditModel findCategoryAndAllNodes(String categoryIdString) {
CategoryAndMemberNodes cat = getCategory(categoryIdString);
List<OnmsNode> monitoredNodes = findAllNodes();
return new EditModel(cat.getCategory(), monitoredNodes, cat.getMemberNodes());
}
/**
* <p>performEdit</p>
*
* @param categoryIdString a {@link java.lang.String} object.
* @param editAction a {@link java.lang.String} object.
* @param toAdd an array of {@link java.lang.String} objects.
* @param toDelete an array of {@link java.lang.String} objects.
*/
public void performEdit(String categoryIdString, String editAction,
String[] toAdd, String[] toDelete) {
if (categoryIdString == null) {
throw new IllegalArgumentException("categoryIdString cannot be null");
}
if (editAction == null) {
throw new IllegalArgumentException("editAction cannot be null");
}
OnmsCategory category = findCategory(categoryIdString);
if (editAction.contains("Add")) { // @i18n
if (toAdd == null) {
return;
//throw new IllegalArgumentException("toAdd cannot be null if editAction is 'Add'");
}
for (String idString : toAdd) {
Integer id;
try {
id = WebSecurityUtils.safeParseInt(idString);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("toAdd element '"
+ idString
+ "' is not an integer");
}
OnmsNode node = getNodeDao().get(id);
if (node == null) {
throw new IllegalArgumentException("node with "
+ "id of " + id
+ "could not be found");
}
if (node.getCategories().contains(category)) {
throw new IllegalArgumentException("node with "
+ "id of " + id
+ "is already a member of "
+ "category "
+ category.getName());
}
node.addCategory(category);
getNodeDao().save(node);
}
} else if (editAction.contains("Remove")) { // @i18n
if (toDelete == null) {
return;
//throw new IllegalArgumentException("toDelete cannot be null if editAction is 'Remove'");
}
for (String idString : toDelete) {
Integer id;
try {
id = WebSecurityUtils.safeParseInt(idString);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("toDelete element '"
+ idString
+ "' is not an integer");
}
OnmsNode node = getNodeDao().get(id);
if (node == null) {
throw new IllegalArgumentException("node with "
+ "id of " + id
+ "could not be found");
}
if (!node.getCategories().contains(category)) {
throw new IllegalArgumentException("Node with "
+ "id of " + id
+ "is not a member of "
+ "category "
+ category.getName());
}
node.removeCategory(category);
getNodeDao().save(node);
}
} else {
throw new IllegalArgumentException("editAction of '"
+ editAction
+ "' is not allowed");
}
}
/** {@inheritDoc} */
public OnmsCategory addNewCategory(final String name) {
OnmsCategory category = new OnmsCategory();
category.setName(name);
m_categoryDao.save(category);
return category;
}
/** {@inheritDoc} */
public OnmsCategory getCategoryWithName(final String name) {
return m_categoryDao.findByName(name);
}
/**
* <p>findAllCategories</p>
*
* @return a {@link java.util.List} object.
*/
public List<OnmsCategory> findAllCategories() {
Collection<OnmsCategory> categories = m_categoryDao.findAll();
List<OnmsCategory> sortedCategories =
new ArrayList<OnmsCategory>(categories);
Collections.sort(sortedCategories, new Comparator<OnmsCategory>() {
public int compare(OnmsCategory o1, OnmsCategory o2) {
return o1.getName().compareTo(o2.getName());
}
});
return sortedCategories;
}
/** {@inheritDoc} */
public void removeCategory(String categoryIdString) {
OnmsCategory category = findCategory(categoryIdString);
CategoryAndMemberNodes cat = getCategory(categoryIdString);
for (OnmsNode adriftNode : cat.getMemberNodes()) {
notifyCategoryChange(adriftNode);
}
m_categoryDao.delete(category);
}
/** {@inheritDoc} */
public List<OnmsCategory> findByNode(int nodeId) {
final OnmsNode node = getNodeDao().get(nodeId);
if (node == null) {
throw new IllegalArgumentException("node with id of " + nodeId + "could not be found");
}
List<OnmsCategory> categories = new ArrayList<OnmsCategory>(node.getCategories());
Collections.sort(categories);
return categories;
}
/** {@inheritDoc} */
public NodeEditModel findNodeCategories(String nodeIdString) {
if (nodeIdString == null) {
throw new IllegalArgumentException("nodeIdString must not be null");
}
OnmsNode node = findNode(nodeIdString);
List<OnmsCategory> categories = findAllCategories();
return new NodeEditModel(node, categories);
}
/**
* <p>performNodeEdit</p>
*
* @param nodeIdString a {@link java.lang.String} object.
* @param editAction a {@link java.lang.String} object.
* @param toAdd an array of {@link java.lang.String} objects.
* @param toDelete an array of {@link java.lang.String} objects.
*/
public void performNodeEdit(String nodeIdString, String editAction,
String[] toAdd, String[] toDelete) {
if (nodeIdString == null) {
throw new IllegalArgumentException("nodeIdString cannot be null");
}
if (editAction == null) {
throw new IllegalArgumentException("editAction cannot be null");
}
OnmsNode node = findNode(nodeIdString);
if (editAction.contains("Add")) { // @i18n
if (toAdd == null) {
return;
//throw new IllegalArgumentException("toAdd cannot be null if editAction is 'Add'");
}
for (String idString : toAdd) {
Integer id;
try {
id = WebSecurityUtils.safeParseInt(idString);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("toAdd element '"
+ idString
+ "' is not an integer");
}
OnmsCategory category = m_categoryDao.get(id);
if (node == null) {
throw new IllegalArgumentException("Category with "
+ "id of " + id
+ "could not be found");
}
if (node.getCategories().contains(category)) {
throw new IllegalArgumentException("Category with "
+ "id of " + id
+ "is already on node "
+ node.getLabel());
}
node.getCategories().add(category);
}
getNodeDao().save(node);
notifyCategoryChange(node);
} else if (editAction.contains("Remove")) { // @i18n
if (toDelete == null) {
return;
//throw new IllegalArgumentException("toDelete cannot be null if editAction is 'Remove'");
}
for (String idString : toDelete) {
Integer id;
try {
id = WebSecurityUtils.safeParseInt(idString);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("toDelete element '"
+ idString
+ "' is not an integer");
}
OnmsCategory category = m_categoryDao.get(id);
if (node == null) {
throw new IllegalArgumentException("Category with "
+ "id of " + id
+ "could not be found");
}
if (!node.getCategories().contains(category)) {
throw new IllegalArgumentException("Category with "
+ "id of " + id
+ "is not on node "
+ node.getLabel());
}
node.getCategories().remove(category);
}
getNodeDao().save(node);
notifyCategoryChange(node);
} else {
throw new IllegalArgumentException("editAction of '"
+ editAction
+ "' is not allowed");
}
}
private OnmsNode findNode(String nodeIdString) {
final int nodeId;
try {
nodeId = WebSecurityUtils.safeParseInt(nodeIdString);
} catch (final NumberFormatException e) {
throw new IllegalArgumentException("parameter 'node' with value '" + nodeIdString + "' could not be parsed as an integer");
}
return getNodeDao().get(nodeId);
}
private void notifyCategoryChange(final OnmsNode node) {
EventBuilder bldr = new EventBuilder(EventConstants.NODE_CATEGORY_MEMBERSHIP_CHANGED_EVENT_UEI, "CategoryUI");
bldr.setNode(node);
bldr.setParam("nodelabel", node.getLabel());
send(bldr.getEvent());
}
private void send(final Event e) {
try {
m_eventProxy.send(e);
} catch (final EventProxyException e1) {
throw new DataSourceLookupFailureException("Unable to send event to eventd", e1);
}
}
public class CategoryAndMemberNodes {
private OnmsCategory m_category;
private Collection<OnmsNode> m_memberNodes;
public CategoryAndMemberNodes(OnmsCategory category,
Collection<OnmsNode> memberNodes) {
m_category = category;
m_memberNodes = memberNodes;
}
public OnmsCategory getCategory() {
return m_category;
}
public Collection<OnmsNode> getMemberNodes() {
return m_memberNodes;
}
}
public class EditModel {
private OnmsCategory m_category;
private List<OnmsNode> m_nodes;
private List<OnmsNode> m_sortedMemberNodes;
public EditModel(OnmsCategory category, List<OnmsNode> nodes,
Collection<OnmsNode> memberNodes) {
m_category = category;
m_nodes = nodes;
for (OnmsNode node : memberNodes) {
m_nodes.remove(node);
}
m_sortedMemberNodes =
new ArrayList<OnmsNode>(memberNodes);
Collections.sort(m_sortedMemberNodes);
}
public OnmsCategory getCategory() {
return m_category;
}
public List<OnmsNode> getNodes() {
return m_nodes;
}
public List<OnmsNode> getSortedMemberNodes() {
return m_sortedMemberNodes;
}
}
public class NodeEditModel {
private OnmsNode m_node;
private List<OnmsCategory> m_categories;
private List<OnmsCategory> m_sortedCategories;
public NodeEditModel(OnmsNode node, List<OnmsCategory> categories) {
m_node = node;
m_categories = categories;
for (OnmsCategory category : m_node.getCategories()) {
m_categories.remove(category);
}
m_sortedCategories =
new ArrayList<OnmsCategory>(m_node.getCategories());
Collections.sort(m_sortedCategories);
}
public OnmsNode getNode() {
return m_node;
}
public List<OnmsCategory> getCategories() {
return m_categories;
}
public List<OnmsCategory> getSortedCategories() {
return m_sortedCategories;
}
}
}