/* * Copyright (C) 2011 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.infinispan; import org.exoplatform.commons.utils.PropertyManager; import org.exoplatform.container.StandaloneContainer; import java.net.URL; /** * This class is used to be able to launch a cache instance as a JVM in standalone mode, it * will then be able to join an existing cluster of distributed caches. * It will be launched using the standalone container initialized thanks to the configuration * file whose path is expected as the first argument, by default it will * use <i>/conf/cache-server-configuration.xml</i> that is bundled into the current jar file. * * The expected path is an absolute path or a relative path from the user directory * or from the {@link ClassLoader}. * * Please note that this cache server should be used only for a distributed cache. * * @author <a href="mailto:nfilotto@exoplatform.com">Nicolas Filotto</a> * @version $Id$ * */ public class CacheServer { private static final String DEFAULT_CONFIG_FILE_PATH = "/conf/cache-server-configuration.xml"; private static void help(String errorMessage) { StringBuilder sb = new StringBuilder(); if (errorMessage != null) { sb.append(errorMessage + ", t"); } else { sb.append("T"); } sb.append("he expected arguments are: help|?|<configuration-file-path>|udp|tcp <initial-hosts>"); System.err.println(sb.toString());//NOSONAR } /** * @param args */ public static void main(String[] args) throws Exception { String configPath; if (args == null || args.length == 0) { configPath = DEFAULT_CONFIG_FILE_PATH; } else if (args.length == 1) { String arg = args[0]; if ("help".equals(arg) || "?".equals(arg)) { help(null); return; } else if ("udp".equals(arg)) { configPath = DEFAULT_CONFIG_FILE_PATH; } else if ("tcp".equals(arg)) { configPath = DEFAULT_CONFIG_FILE_PATH; addTCP2ProfileList(); PropertyManager.setProperty("jgroups.bind_addr", "127.0.0.1"); System.out.println("No initial hosts have been configured so the bind address "//NOSONAR + "has been automatically set to 127.0.0.1 assuming that it has been properly" + " configured to map to localhost"); } else { configPath = arg; } } else if (args.length == 2) { String arg = args[0]; if ("tcp".equals(arg)) { configPath = DEFAULT_CONFIG_FILE_PATH; addTCP2ProfileList(); PropertyManager.setProperty("jgroups.tcpping.initial_hosts", args[1]); System.out.println("The initial hosts have been configured to:" + args[1]);//NOSONAR } else { help("Unexpected syntax"); return; } } else { help("Too many arguments"); return; } System.out.println("The configuration file will be loaded from '" + configPath + "'");//NOSONAR URL configUrl = CacheServer.class.getResource(configPath); if (configUrl != null) { StandaloneContainer.addConfigurationURL(configUrl.toString()); } else { StandaloneContainer.addConfigurationPath(configPath); } StandaloneContainer.getInstance(); } private static void addTCP2ProfileList() { String profiles = PropertyManager.getProperty(PropertyManager.RUNTIME_PROFILES); StringBuilder sb = new StringBuilder(); if (profiles != null && !profiles.isEmpty()) { sb.append(profiles); sb.append(','); } sb.append("tcp"); PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES, sb.toString()); System.out.println("The tcp stack has been enabled");//NOSONAR } }