/******************************************************************************* * 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.netmgt.ncs.persistence; import java.util.List; import org.opennms.netmgt.dao.hibernate.AbstractDaoHibernate; import org.opennms.netmgt.model.ncs.NCSComponent; import org.opennms.netmgt.model.ncs.NCSComponentRepository; import org.springframework.dao.DataAccessException; public class NCSComponentDao extends AbstractDaoHibernate<NCSComponent, Long> implements NCSComponentRepository { public NCSComponentDao() { super(NCSComponent.class); } @Override public NCSComponent findByTypeAndForeignIdentity(String type, String foreignSource, String foreignId) { return findUnique("from NCSComponent as ncs where ncs.type = ? and ncs.foreignSource = ? and ncs.foreignId = ?", type, foreignSource, foreignId); } @Override public List<NCSComponent> findComponentsThatDependOn(NCSComponent component) { return find("from NCSComponent as ncs where ? in elements(ncs.subcomponents)", component); } public List<NCSComponent> findComponentsWithChild(final NCSComponent component) { return find("from NCSComponent as ncs where ? in elements(ncs.parentcomponents)", component); } @Override public List<NCSComponent> findComponentsWithAttribute(String attrKey, String attrValue) { return find("from NCSComponent as ncs where ncs.attributes[?] = ?", attrKey, attrValue); } @Override public List<NCSComponent> findComponentsByNodeId(int nodeid) { return find("select distinct ncs from NCSComponent as ncs, OnmsNode as n left join fetch ncs.attributes where ncs.nodeIdentification.foreignSource = n.foreignSource and ncs.nodeIdentification.foreignId = n.foreignId and n.id = ?", nodeid); } @Override public void save(final NCSComponent entity) throws DataAccessException { validateEntity(entity); super.save(entity); } @Override public void saveOrUpdate(final NCSComponent entity) throws DataAccessException { validateEntity(entity); super.saveOrUpdate(entity); } // enforcing no colons seems to be not very feasible in The Real World private void validateEntity(final NCSComponent entity) throws DataAccessException { /* if (entity.getForeignId().contains(":")) { throw new InvalidForeignIdException("Foreign ID cannot contain a colon!"); } if (entity.getForeignSource().contains(":")) { throw new InvalidForeignSourceException(entity.getForeignSource(), "Foreign Source cannot contain a colon!"); } for (final NCSComponent component : entity.getSubcomponents()) { validateEntity(component); } */ } public static final class InvalidForeignIdException extends DataAccessException { private static final long serialVersionUID = -762719422321681955L; public InvalidForeignIdException(final String msg) { super("Invalid Foreign ID: " + msg); } public InvalidForeignIdException(final String foreignId, final String msg) { super("Invalid Foreign ID (" + foreignId + "): " + msg); } } public static final class InvalidForeignSourceException extends DataAccessException { private static final long serialVersionUID = -4762525172339952143L; public InvalidForeignSourceException(final String msg) { super("Invalid Foreign Source: " + msg); } public InvalidForeignSourceException(final String foreignSource, final String msg) { super("Invalid Foreign Source (" + foreignSource + "): " + msg); } } }