/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * 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 version 2 of the License. * * 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.configuration; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.resource.Resource; import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.util.LookupUtil; /** * @author Ian Springer */ public class LiveConfigurationLoader { private static LiveConfigurationLoader ourInstance = new LiveConfigurationLoader(); private final Log log = LogFactory.getLog(LiveConfigurationLoader.class); private ConfigurationManagerLocal configurationManager = LookupUtil.getConfigurationManager(); private SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager(); public static LiveConfigurationLoader getInstance() { return ourInstance; } /** * * @param resources * @param timeout the number of seconds before this call should timeout and * @return * @throws Exception */ public Map<Integer, Configuration> loadLiveResourceConfigurations(final Set<Resource> resources, long timeout) { try { FutureTask<Map<Integer, Configuration>> task = new FutureTask<Map<Integer, Configuration>>( new Callable<Map<Integer, Configuration>>() { public Map<Integer, Configuration> call() throws Exception { return loadLiveResourceConfigurations(resources); } }); new Thread(task).start(); return task.get(timeout, TimeUnit.SECONDS); } catch (TimeoutException e) { throw new RuntimeException("Timed out after " + timeout + " seconds while retrieving live Resource configurations."); } catch (Exception e) { throw new RuntimeException("Failed to retrieve live Resource configurations.", e); } } private Map<Integer, Configuration> loadLiveResourceConfigurations(Set<Resource> resources) throws Exception { log.info("Loading live configs for " + resources.size() + " Resources..."); long startTime = System.currentTimeMillis(); Map<Integer, Configuration> liveConfigs = new HashMap<Integer, Configuration>(); for (Resource resource : resources) { Configuration liveConfig = this.configurationManager.getLiveResourceConfiguration(this.subjectManager .getOverlord(), resource.getId(), false); if (liveConfig == null) throw new Exception("Failed to obtain live Resource configuration for " + resource + "."); liveConfigs.put(resource.getId(), liveConfig); } long elapsedTime = System.currentTimeMillis() - startTime; log.info("Loaded live configs for " + resources.size() + " Resources in " + elapsedTime + " ms."); return liveConfigs; } private LiveConfigurationLoader() { } }