/* * org.openmicroscopy.shoola.env.init.AgentsInit * *------------------------------------------------------------------------------ * Copyright (C) 2006-2015 University of Dundee. 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; either version 2 of the License, or * (at your option) any later version. * 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.env.init; import java.util.Iterator; import java.util.List; import org.openmicroscopy.shoola.env.Agent; import org.openmicroscopy.shoola.env.LookupNames; import org.openmicroscopy.shoola.env.config.AgentInfo; import org.openmicroscopy.shoola.env.config.Registry; import org.openmicroscopy.shoola.env.config.RegistryFactory; /** * This task creates all agents specified in the container's configuration file * and, for each of them, populates their own registry. * * @see InitializationTask * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author <br>Andrea Falconi      * <a href="mailto:a.falconi@dundee.ac.uk"> * a.falconi@dundee.ac.uk</a> * @version 2.2 * <small> * (<b>Internal version:</b> $Revision$ $Date$) * </small> * @since OME2.2 */ public final class AgentsInit extends InitializationTask { /** * Instantiates, by reflection, the specified agent and populates its * registry. * This method will set the new agent instance and its registry into the * passed <code>info</code> object. * * @param info Specifies which class to instantiate and collects the * agent instance as well as its registry. * @param value The number of the master. * @throws StartupException If the agent couldn't be instantiated or its * registry couldn't be populated. */ private void createAgent(AgentInfo info, int value) throws StartupException { if (!info.isActive()) return; Class agentClass; Object agentInstance; Registry reg; try { agentClass = Class.forName(info.getAgentClass()); //Make sure it implements the Agent I/F. if (!Agent.class.isAssignableFrom(agentClass)) throw new Exception(agentClass+"'s type is not Agent."); //Create a new instance. agentInstance = agentClass.newInstance(); //Create the agent's registry. reg = createAgentRegistry(info.getConfigPath()); //Fill up info. (Recall that this object is already in the //agents list within the container's registry.) Agent agent = (Agent) agentInstance; info.setAgent(agent); info.setRegistry(reg); Registry containerRegistry = container.getRegistry(); //Register the master if (info.isActive()) { if (info.getNumber() == value && value == LookupNames.IMPORTER_ENTRY) { containerRegistry.bind(LookupNames.MASTER, LookupNames.MASTER_IMPORTER); } } reg.bind(LookupNames.DATA_DISPLAY, containerRegistry.lookup(LookupNames.DATA_DISPLAY)); reg.bind(LookupNames.DEBUGGER_ADDRESS, containerRegistry.lookup(LookupNames.DEBUGGER_ADDRESS)); } catch (Exception e) { throw new StartupException("Couldn't create agent: "+ info.getName(), e); } } /** * Creates a new registry from the specified configuration file. * The new registry is populated with all entries from the configuration * file plus links to the container's services. * * @param configFile Relative pathname to the configuration file. The * pathname is resolved against the configuration * directory. * @return A new registry, populated as specified above. * @throws Exception If the configuration file couldn't be read in and * parsed correctly. */ private Registry createAgentRegistry(String configFile) throws Exception { String pathName = container.getConfigFileRelative(configFile); Registry agentReg = RegistryFactory.makeNew(pathName), containerReg = container.getRegistry(); RegistryFactory.linkEventBus(containerReg.getEventBus(), agentReg); RegistryFactory.linkLogger(containerReg.getLogger(), agentReg); RegistryFactory.linkIS(containerReg.getImageService(), agentReg); RegistryFactory.linkTaskBar(containerReg.getTaskBar(), agentReg); RegistryFactory.linkUserNotifier(containerReg.getUserNotifier(), agentReg); RegistryFactory.linkOS(containerReg.getDataService(), agentReg); RegistryFactory.linkMS(containerReg.getMetadataService(), agentReg); RegistryFactory.linkAdmin(containerReg.getAdminService(), agentReg); return agentReg; } /** Constructor required by superclass. */ public AgentsInit() {} /** * Returns the name of this task. * @see InitializationTask#getName() */ String getName() { return "Loading Agents"; } /** * Does nothing, as this task requires no set up. * @see InitializationTask#configure() */ void configure() {} /** * Carries out this task. * @see InitializationTask#execute() */ void execute() throws StartupException { Registry reg = container.getRegistry(); Integer v = (Integer) reg.lookup(LookupNames.ENTRY_POINT); int value = LookupNames.INSIGHT_ENTRY; if (v != null) { switch (v.intValue()) { case LookupNames.IMPORTER_ENTRY: case LookupNames.INSIGHT_ENTRY: value = v.intValue(); } } List<AgentInfo> agents = (List<AgentInfo>) reg.lookup(LookupNames.AGENTS); Iterator<AgentInfo> i = agents.iterator(); while (i.hasNext()) createAgent(i.next(), value); String name = (String) container.getRegistry().lookup( LookupNames.MASTER); if (name == null) { name = LookupNames.MASTER_INSIGHT; } //check if run as an ij plugin. Integer plugin = (Integer) container.getRegistry().lookup( LookupNames.PLUGIN); if (plugin != null) { switch (plugin) { case LookupNames.IMAGE_J: case LookupNames.IMAGE_J_IMPORT: name = LookupNames.MASTER_IJ; } } container.getRegistry().bind(LookupNames.MASTER, name); } /** * Does nothing. * @see InitializationTask#rollback() */ void rollback() {} }