package org.safehaus.penrose.federation; import org.apache.log4j.*; import org.apache.log4j.xml.DOMConfigurator; import org.safehaus.penrose.client.PenroseClient; import org.safehaus.penrose.partition.PartitionClient; import org.safehaus.penrose.partition.PartitionManagerClient; import org.safehaus.penrose.module.ModuleClient; import org.safehaus.penrose.module.ModuleManagerClient; import java.util.Collection; import java.util.ArrayList; import java.util.Iterator; import java.io.File; import gnu.getopt.LongOpt; import gnu.getopt.Getopt; /** * @author Endi Sukma Dewata */ public class FederationClient implements FederationMBean { public static Logger log = Logger.getLogger(FederationClient.class); String federationDomain; PenroseClient client; public FederationClient(PenroseClient client, String federationDomain) throws Exception { this.client = client; this.federationDomain = federationDomain; } public String getFederationDomain() { return federationDomain; } public PartitionClient getPartitionClient() throws Exception { PartitionManagerClient partitionManagerClient = client.getPartitionManagerClient(); return partitionManagerClient.getPartitionClient(federationDomain); } public ModuleClient getModuleClient() throws Exception { ModuleManagerClient moduleManagerClient = getPartitionClient().getModuleManagerClient(); return moduleManagerClient.getModuleClient(Federation.FEDERATION); } public Collection<String> getRepositoryTypes() throws Exception { return (Collection<String>)getModuleClient().getAttribute("RepositoryTypes"); } public PenroseClient getClient() { return client; } public ModuleClient getRepositoryModuleClient(String type) throws Exception { ModuleManagerClient moduleManagerClient = getPartitionClient().getModuleManagerClient(); return moduleManagerClient.getModuleClient(type); } public void addRepository(FederationRepositoryConfig repository) throws Exception { getModuleClient().invoke( "addRepository", new Object[] { repository }, new String[] { FederationRepositoryConfig.class.getName() } ); } public void updateRepository(FederationRepositoryConfig repository) throws Exception { getModuleClient().invoke( "updateRepository", new Object[] { repository }, new String[] { FederationRepositoryConfig.class.getName() } ); } public void removeRepository(String repositoryName) throws Exception { getModuleClient().invoke( "removeRepository", new Object[] { repositoryName }, new String[] { String.class.getName() } ); } public FederationConfig getFederationConfig() throws Exception { return (FederationConfig)getModuleClient().getAttribute("FederationConfig"); } public void setFederationConfig(FederationConfig federationConfig) throws Exception { getModuleClient().setAttribute("FederationConfig", federationConfig); } public void load() throws Exception { getModuleClient().invoke("load"); } public void store() throws Exception { getModuleClient().invoke("store"); } public void clear() throws Exception { getModuleClient().invoke("clear"); } public Collection<String> getRepositoryNames() throws Exception { return (Collection<String>)getModuleClient().getAttribute("RepositoryNames"); } public Collection<String> getRepositoryNames(String type) throws Exception { return (Collection<String>)getModuleClient().invoke( "getRepositoryNames", new Object[] { type }, new String[] { String.class.getName() } ); } public Collection<FederationRepositoryConfig> getRepositories() throws Exception { return (Collection<FederationRepositoryConfig>)getModuleClient().getAttribute("Repositories"); } public Collection<FederationRepositoryConfig> getRepositories(String type) throws Exception { return (Collection<FederationRepositoryConfig>)getModuleClient().invoke( "getRepositories", new Object[] { type }, new String[] { String.class.getName() } ); } public FederationRepositoryConfig getRepository(String name) throws Exception { return (FederationRepositoryConfig)getModuleClient().invoke( "getRepository", new Object[] { name }, new String[] { String.class.getName() } ); } public Collection<String> getPartitionNames() throws Exception { return (Collection)getModuleClient().invoke( "getPartitionNames", new Object[] { }, new String[] { } ); } public Collection<FederationPartitionConfig> getPartitions() throws Exception { return (Collection)getModuleClient().invoke( "getPartitions", new Object[] { }, new String[] { } ); } public FederationPartitionConfig getPartition(String name) throws Exception { return (FederationPartitionConfig)getModuleClient().invoke( "getPartition", new Object[] { name }, new String[] { String.class.getName() } ); } public void createPartition(String name) throws Exception { getModuleClient().invoke( "createPartition", new Object[] { name }, new String[] { String.class.getName() } ); } public void removePartition(String name) throws Exception { getModuleClient().invoke( "removePartition", new Object[] { name }, new String[] { String.class.getName() } ); } public void synchronize(String name) throws Exception { getModuleClient().invoke( "synchronize", new Object[] { name }, new String[] { String.class.getName() } ); } public static void execute(PenroseClient client, Collection<String> commands) throws Exception { Iterator<String> iterator = commands.iterator(); String command = iterator.next(); if ("show".equals(command)) { String partition = iterator.next(); FederationClient federationClient = new FederationClient(client, partition); } else if ("synchronize".equals(command)) { String partition = iterator.next(); FederationClient federationClient = new FederationClient(client, partition); Collection<String> repositoryNames; if (iterator.hasNext()) { repositoryNames = new ArrayList<String>(); while (iterator.hasNext()) { String repository = iterator.next(); repositoryNames.add(repository); } } else { repositoryNames = federationClient.getRepositoryNames(); } for (String repository : repositoryNames) { System.out.println("Synchronizing "+repository+"..."); federationClient.synchronize(repository); } System.out.println("Done."); } else { throw new Exception("Unknown command: "+command); } } public static void showUsage() { System.out.println("Usage: org.safehaus.penrose.federation.FederationClient [OPTION]... <command> [arguments]..."); System.out.println(); System.out.println("Options:"); System.out.println(" -?, --help display this help and exit"); System.out.println(" -P protocol Penrose JMX protocol"); System.out.println(" -h host Penrose server"); System.out.println(" -p port Penrose JMX port"); System.out.println(" -D username username"); System.out.println(" -w password password"); System.out.println(" -d run in debug mode"); System.out.println(" -v run in verbose mode"); System.out.println(); System.out.println("Commands:"); System.out.println(" show domains Show all federation domains."); System.out.println(" show <domain> Show federation domain."); System.out.println(" show partitions in domain <domain> Show partitions in this domain."); System.out.println(" synchronize partition <partition> in domain <domain> Synchronize partition in this domain."); } public static void main(String args[]) throws Exception { Level level = Level.WARN; String serverType = PenroseClient.PENROSE; String protocol = PenroseClient.DEFAULT_PROTOCOL; String hostname = "localhost"; int port = PenroseClient.DEFAULT_RMI_PORT; int rmiTransportPort = PenroseClient.DEFAULT_RMI_TRANSPORT_PORT; String bindDn = null; String bindPassword = null; LongOpt[] longopts = new LongOpt[1]; longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, '?'); Getopt getopt = new Getopt("FederationClient", args, "-:?dvt:h:p:r:P:D:w:", longopts); Collection<String> commands = new ArrayList<String>(); int c; while ((c = getopt.getopt()) != -1) { switch (c) { case ':': case '?': showUsage(); System.exit(0); break; case 1: commands.add(getopt.getOptarg()); break; case 'd': level = Level.DEBUG; break; case 'v': level = Level.INFO; break; case 'P': protocol = getopt.getOptarg(); break; case 't': serverType = getopt.getOptarg(); break; case 'h': hostname = getopt.getOptarg(); break; case 'p': port = Integer.parseInt(getopt.getOptarg()); break; case 'r': rmiTransportPort = Integer.parseInt(getopt.getOptarg()); break; case 'D': bindDn = getopt.getOptarg(); break; case 'w': bindPassword = getopt.getOptarg(); } } if (commands.size() == 0) { showUsage(); System.exit(0); } File penroseHome = new File(System.getProperty("org.safehaus.penrose.client.home")); //Logger rootLogger = Logger.getRootLogger(); //rootLogger.setLevel(Level.OFF); Logger logger = Logger.getLogger("org.safehaus.penrose"); File log4jXml = new File(penroseHome, "conf"+File.separator+"log4j.xml"); if (level.equals(Level.DEBUG)) { logger.setLevel(level); ConsoleAppender appender = new ConsoleAppender(new PatternLayout("%-20C{1} [%4L] %m%n")); BasicConfigurator.configure(appender); } else if (level.equals(Level.INFO)) { logger.setLevel(level); ConsoleAppender appender = new ConsoleAppender(new PatternLayout("[%d{MM/dd/yyyy HH:mm:ss}] %m%n")); BasicConfigurator.configure(appender); } else if (log4jXml.exists()) { DOMConfigurator.configure(log4jXml.getAbsolutePath()); } else { logger.setLevel(level); ConsoleAppender appender = new ConsoleAppender(new PatternLayout("[%d{MM/dd/yyyy HH:mm:ss}] %m%n")); BasicConfigurator.configure(appender); } try { PenroseClient client = new PenroseClient( serverType, protocol, hostname, port, bindDn, bindPassword ); client.setRmiTransportPort(rmiTransportPort); client.connect(); execute(client, commands); client.close(); } catch (SecurityException e) { log.error(e.getMessage()); } catch (Exception e) { log.error(e.getMessage(), e); } } }