/** * Set node-specific immutable settings and initialize components. This method must be called * exactly once for each instance. * * <p>Scratch space configuration is checked and initialized. * * <p>State of an instance remains not configured if exception appears. * * @param node node to configure * @param baseScratchConfiguration base scratch data space configuration, may be <code>null</code> * if node does not provide a scratch space; not existing directory pointed by this * configuration will be created * @throws IllegalStateException when trying to reconfigure already configured instance * @throws IllegalArgumentException when trying to configure node that is on different runtime/JVM * @throws ConfigurationException when configuration appears to be wrong during node scratch space * initialization (e.g. capabilities checking) * @throws FileSystemException when VFS creation or scratch initialization fails */ public synchronized void configureNode( Node node, BaseScratchSpaceConfiguration baseScratchConfiguration) throws IllegalStateException, IllegalArgumentException, FileSystemException, ConfigurationException { logger.debug("Configuring node for Data Spaces"); checkNotConfigured(); if (!NodeFactory.isNodeLocal(node)) { logger.error("Node to configure is not on the same runtime/JVM as a caller"); throw new IllegalArgumentException( "Node to configure is not on the same runtime/JVM as a caller"); } this.node = node; try { if (baseScratchConfiguration != null) { if (baseScratchConfiguration.getUrl() == null) { baseScratchConfiguration = startProActiveProviderServer(baseScratchConfiguration); } final NodeScratchSpace configuringScratchSpace = new VFSNodeScratchSpaceImpl(); configuringScratchSpace.init(node, baseScratchConfiguration); this.nodeScratchSpace = configuringScratchSpace; } configured = true; } finally { if (!configured) { tryCloseProviderServer(); // node scratch space is not configured (does not need close) for sure } } logger.debug("Node configured for Data Spaces"); }