001/*
002 * #%L
003 * Netarchivesuite - monitor
004 * %%
005 * Copyright (C) 2005 - 2014 The Royal Danish Library, the Danish State and University Library,
006 *             the National Library of France and the Austrian National Library.
007 * %%
008 * This program is free software: you can redistribute it and/or modify
009 * it under the terms of the GNU Lesser General Public License as
010 * published by the Free Software Foundation, either version 2.1 of the
011 * License, or (at your option) any later version.
012 * 
013 * This program is distributed in the hope that it will be useful,
014 * but WITHOUT ANY WARRANTY; without even the implied warranty of
015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016 * GNU General Lesser Public License for more details.
017 * 
018 * You should have received a copy of the GNU General Lesser Public
019 * License along with this program.  If not, see
020 * <http://www.gnu.org/licenses/lgpl-2.1.html>.
021 * #L%
022 */
023package dk.netarkivet.monitor.registry;
024
025import java.util.Collections;
026import java.util.HashMap;
027import java.util.HashSet;
028import java.util.Map;
029import java.util.Set;
030
031import org.slf4j.Logger;
032import org.slf4j.LoggerFactory;
033
034import dk.netarkivet.common.distribute.monitorregistry.HostEntry;
035import dk.netarkivet.common.exceptions.ArgumentNotValid;
036
037/**
038 * A registry of known JMX URLs. This class is coded to be thread safe.
039 */
040public class MonitorRegistry {
041
042    /** A map from host names to known host entries. */
043    private Map<String, Set<HostEntry>> hostEntries = Collections
044            .synchronizedMap(new HashMap<String, Set<HostEntry>>());
045    /** The singleton instance. */
046    private static MonitorRegistry instance;
047    /** The logger for this class. */
048    private static final Logger log = LoggerFactory.getLogger(MonitorRegistry.class);
049
050    /**
051     * Get the singleton instance.
052     *
053     * @return The singleton instance.
054     */
055    public static synchronized MonitorRegistry getInstance() {
056        if (instance == null) {
057            instance = new MonitorRegistry();
058        }
059        return instance;
060    }
061
062    /**
063     * Register or re-register a JMX host entry.
064     *
065     * @param hostEntry The entry to add
066     * @throws ArgumentNotValid if hostEntry is null.
067     */
068    public synchronized void register(HostEntry hostEntry) {
069        ArgumentNotValid.checkNotNull(hostEntry, "HostEntry hostEntry");
070        Set<HostEntry> set = hostEntries.get(hostEntry.getName());
071        if (set == null) {
072            set = Collections.synchronizedSet(new HashSet<HostEntry>());
073            hostEntries.put(hostEntry.getName(), set);
074        }
075        
076        if (set.add(hostEntry)) { 
077            // An hostEntry did not previously exist with tuple<name,jmxport, jmxport>=<hostEntry.getName(), hostEntry.getJmxPort(), hostEntry.getRmiPort()>
078            log.info("Added host '{}' port {}/{}", hostEntry.getName(), hostEntry.getJmxPort(), hostEntry.getRmiPort());
079        } else { 
080            // remove and add the entry with updated timestamp.
081            set.remove(hostEntry);
082            set.add(hostEntry);
083            log.trace("Updated time for '{}' port {}/{} to {}", hostEntry.getName(), hostEntry.getJmxPort(),
084                    hostEntry.getRmiPort(), hostEntry.getTime());
085        }
086    }
087
088    /**
089     * Get all JMX host entries.
090     *
091     * @return All JMX host entries.
092     */
093    public synchronized Map<String, Set<HostEntry>> getHostEntries() {
094        return new HashMap<String, Set<HostEntry>>((hostEntries));
095    }
096
097}