/* * Copyright (c) 2012 Eike Stepper (Berlin, Germany) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eike Stepper - initial API and implementation */ package org.eclipse.emf.cdo.examples.client.offline.nodes; import org.eclipse.net4j.util.container.Container; import org.eclipse.net4j.util.io.IORuntimeException; import org.eclipse.net4j.util.io.IOUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; /** * @author Eike Stepper */ public class NodeManager extends Container<Object> { private static final String NODE_PROPERTIES = "node.properties"; private final Map<String, Node> nodes = new HashMap<String, Node>(); private final NodeType.Client client = new NodeType.Client(this); private final NodeType.NormalRepository normalRepository = new NodeType.NormalRepository(this); private final NodeType.FailoverRepository failoverRepository = new NodeType.FailoverRepository(this); private final NodeType.FailoverMonitor failoverMonitor = new NodeType.FailoverMonitor(this); private final NodeType[] elements = { client, normalRepository, failoverRepository, failoverMonitor }; private final File root; public NodeManager(File root) { this.root = root; if (!root.exists()) { root.mkdirs(); } if (!root.isDirectory()) { throw new IllegalStateException("Problem with root folder: " + root); } List<Node> result = new ArrayList<Node>(); for (File folder : root.listFiles()) { if (folder.isDirectory()) { Node node = loadNode(folder); if (node != null) { result.add(node); } } } activate(); } private Node loadNode(File folder) { Properties properties = loadProperties(folder); if (properties != null) { String typeName = properties.getProperty(NodeType.TYPE_PROPERTY); for (NodeType nodeType : elements) { if (nodeType.getTypeName().equals(typeName)) { Node node = new Node(nodeType, properties); return addNode(node); } } } return null; } private Properties loadProperties(File folder) { File file = new File(folder, NODE_PROPERTIES); if (file.isFile()) { InputStream in = null; try { in = new FileInputStream(file); Properties properties = new Properties(); properties.load(in); return properties; } catch (IOException ex) { throw new IORuntimeException(ex); } finally { IOUtil.close(in); } } return null; } public File getRoot() { return root; } public Node getNode(String name) { return nodes.get(name); } public Node[] getNodes() { Node[] array = nodes.values().toArray(new Node[nodes.size()]); Arrays.sort(array); return array; } @Override public boolean isEmpty() { return false; } public NodeType[] getElements() { return elements; } Node createNode(NodeType nodeType) { Node node = new Node(nodeType); saveNode(node); return addNode(node); } void saveNode(Node node) { OutputStream out = null; try { File folder = node.getFolder(); folder.mkdirs(); File file = new File(folder, NODE_PROPERTIES); out = new FileOutputStream(file); node.getSettings().store(out, "Node Settings"); } catch (IOException ex) { throw new IORuntimeException(ex); } finally { IOUtil.close(out); } } private Node addNode(Node node) { nodes.put(node.getName(), node); node.getType().addElement(node); return node; } }