/******************************************************************************* * 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.collectd; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.Set; import org.opennms.core.utils.ThreadCategory; import org.opennms.netmgt.config.collector.AttributeDefinition; import org.opennms.netmgt.config.collector.AttributeGroup; import org.opennms.netmgt.config.collector.CollectionAttribute; import org.opennms.netmgt.config.collector.CollectionResource; import org.opennms.netmgt.config.collector.Persister; import org.opennms.netmgt.config.collector.ServiceParameters; import org.opennms.netmgt.dao.support.ResourceTypeUtils; import org.opennms.netmgt.model.RrdRepository; import org.opennms.netmgt.rrd.RrdException; /** * <p>BasePersister class.</p> * * @author ranger * @version $Id: $ */ public class BasePersister extends AbstractCollectionSetVisitor implements Persister { private boolean m_ignorePersist = false; private ServiceParameters m_params; private RrdRepository m_repository; private LinkedList<Boolean> m_stack = new LinkedList<Boolean>(); private PersistOperationBuilder m_builder; /** * <p>Constructor for BasePersister.</p> */ public BasePersister() { super(); } /** * <p>Constructor for BasePersister.</p> * * @param params a {@link org.opennms.netmgt.config.collector.ServiceParameters} object. * @param repository a {@link org.opennms.netmgt.model.RrdRepository} object. */ public BasePersister(ServiceParameters params, RrdRepository repository) { super(); m_params = params; m_repository = repository; } /** * <p>commitBuilder</p> */ protected void commitBuilder() { if (isPersistDisabled()) return; String name = m_builder.getName(); try { m_builder.commit(); m_builder = null; } catch (RrdException e) { log().error("Unable to persist data for " + name + ": " + e, e); } } private boolean isPersistDisabled() { return m_params != null && m_params.getParameters().containsKey("storing-enabled") && m_params.getParameters().get("storing-enabled").equals("false"); } /** {@inheritDoc} */ public void completeAttribute(CollectionAttribute attribute) { popShouldPersist(); } /** {@inheritDoc} */ public void completeGroup(AttributeGroup group) { popShouldPersist(); } /** {@inheritDoc} */ public void completeResource(CollectionResource resource) { popShouldPersist(); } /** * <p>createBuilder</p> * * @param resource a {@link org.opennms.netmgt.config.collector.CollectionResource} object. * @param name a {@link java.lang.String} object. * @param attributeType a {@link org.opennms.netmgt.config.collector.AttributeDefinition} object. */ protected void createBuilder(CollectionResource resource, String name, AttributeDefinition attributeType) { createBuilder(resource, name, Collections.singleton(attributeType)); } /** * <p>createBuilder</p> * * @param resource a {@link org.opennms.netmgt.config.collector.CollectionResource} object. * @param name a {@link java.lang.String} object. * @param attributeTypes a {@link java.util.Set} object. */ protected void createBuilder(CollectionResource resource, String name, Set<AttributeDefinition> attributeTypes) { m_builder = new PersistOperationBuilder(getRepository(), resource, name); if (resource.getTimeKeeper() != null) m_builder.setTimeKeeper(resource.getTimeKeeper()); for (Iterator<AttributeDefinition> iter = attributeTypes.iterator(); iter.hasNext();) { AttributeDefinition attrType = iter.next(); if (attrType instanceof NumericAttributeType) { m_builder.declareAttribute(attrType); } } } /** * <p>getRepository</p> * * @return a {@link org.opennms.netmgt.model.RrdRepository} object. */ public RrdRepository getRepository() { return m_repository; } /** * <p>setRepository</p> * * @param repository a {@link org.opennms.netmgt.model.RrdRepository} object. */ public void setRepository(RrdRepository repository) { m_repository = repository; } /** * <p>log</p> * * @return a {@link org.opennms.core.utils.ThreadCategory} object. */ protected ThreadCategory log() { return ThreadCategory.getInstance(getClass()); } /** {@inheritDoc} */ public void persistNumericAttribute(CollectionAttribute attribute) { log().debug("Persisting "+attribute + (isIgnorePersist() ? ". Ignoring value because of sysUpTime changed" : "")); String value = isIgnorePersist() ? "U" : attribute.getNumericValue(); m_builder.setAttributeValue(attribute.getAttributeType(), value); } /** {@inheritDoc} */ public void persistStringAttribute(CollectionAttribute attribute) { log().debug("Persisting "+attribute); CollectionResource resource = attribute.getResource(); String value = attribute.getStringValue(); File resourceDir = resource.getResourceDir(getRepository()); //String attrVal = (value == null ? null : value.toString()); //if (attrVal == null) { if (value == null) { log().info("No data collected for attribute "+attribute+". Skipping."); return; } String attrName = attribute.getName(); try { ResourceTypeUtils.updateStringProperty(resourceDir, value, attrName); } catch(IOException e) { log().error("Unable to save string attribute " + attribute + ": " + e, e); } } private boolean pop() { boolean top = top(); m_stack.removeLast(); return top; } /** * <p>popShouldPersist</p> * * @return a boolean. */ protected boolean popShouldPersist() { return pop(); } private void push(boolean b) { m_stack.addLast(Boolean.valueOf(b)); } /** * <p>pushShouldPersist</p> * * @param attribute a {@link org.opennms.netmgt.config.collector.CollectionAttribute} object. */ protected void pushShouldPersist(CollectionAttribute attribute) { pushShouldPersist(attribute.shouldPersist(m_params)); } /** * <p>pushShouldPersist</p> * * @param group a {@link org.opennms.netmgt.config.collector.AttributeGroup} object. */ protected void pushShouldPersist(AttributeGroup group) { pushShouldPersist(group.shouldPersist(m_params)); } private void pushShouldPersist(boolean shouldPersist) { push(top() && shouldPersist); } /** * <p>pushShouldPersist</p> * * @param resource a {@link org.opennms.netmgt.config.collector.CollectionResource} object. */ protected void pushShouldPersist(CollectionResource resource) { push(resource.shouldPersist(m_params)); } /** * <p>shouldPersist</p> * * @return a boolean. */ protected boolean shouldPersist() { return top(); } /** * <p>storeAttribute</p> * * @param attribute a {@link org.opennms.netmgt.config.collector.CollectionAttribute} object. */ protected void storeAttribute(CollectionAttribute attribute) { if (shouldPersist()) { attribute.storeAttribute(this); log().debug("Storing attribute "+attribute); } else { log().debug("Not persisting attribute "+attribute + "because shouldPersist is false"); } } private boolean top() { return m_stack.getLast(); } /** {@inheritDoc} */ public void visitAttribute(CollectionAttribute attribute) { pushShouldPersist(attribute); storeAttribute(attribute); } /** {@inheritDoc} */ public void visitGroup(AttributeGroup group) { pushShouldPersist(group); } /** {@inheritDoc} */ public void visitResource(CollectionResource resource) { log().info("Persisting data for resource "+resource); pushShouldPersist(resource); } /** * <p>isIgnorePersist</p> * * @return a boolean. */ public boolean isIgnorePersist() { return m_ignorePersist; } /** * <p>setIgnorePersist</p> * * @param ignore a boolean. */ public void setIgnorePersist(boolean ignore) { m_ignorePersist = ignore; } /** * <p>getBuilder</p> * * @return a {@link org.opennms.netmgt.collectd.PersistOperationBuilder} object. */ public PersistOperationBuilder getBuilder() { return m_builder; } }