/*
*
* Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
* one or more contributor license agreements (see COPYRIGHT for details).
* The CA licenses this file to you under the GNU Affero General Public
* License version 3, (the "License"); you may not use this file except in
* compliance with the License. This file is part of kune.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cc.kune.kunecli;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.naturalcli.Command;
import org.naturalcli.ExecutionException;
import org.naturalcli.InvalidSyntaxException;
import org.naturalcli.NaturalCLI;
import org.naturalcli.commands.ExecuteFileCommand;
import org.naturalcli.commands.HTMLHelpCommand;
import org.naturalcli.commands.HelpCommand;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.event.shared.SimpleEventBus;
import com.googlecode.gwtrpccommlayer.client.GwtRpcService;
import com.googlecode.gwtrpccommlayer.client.Module;
import cc.kune.core.client.rpcservices.ContentServiceAsync;
import cc.kune.core.client.rpcservices.GroupServiceAsync;
import cc.kune.core.client.rpcservices.I18nServiceAsync;
import cc.kune.core.client.rpcservices.InvitationServiceAsync;
import cc.kune.core.client.rpcservices.SiteServiceAsync;
import cc.kune.core.client.rpcservices.SocialNetServiceAsync;
import cc.kune.core.client.rpcservices.UserServiceAsync;
import cc.kune.kunecli.cmds.AuthCommand;
import cc.kune.kunecli.cmds.DeltaMigrationToMongoCommand;
import cc.kune.kunecli.cmds.GroupsCount;
import cc.kune.kunecli.cmds.GroupsReindexCommand;
import cc.kune.kunecli.cmds.SiteI18nStatsCommand;
import cc.kune.kunecli.cmds.SiteInviteCommand;
import cc.kune.kunecli.cmds.SiteReindexCommand;
import cc.kune.kunecli.cmds.SiteReloadPropertiesCommand;
import cc.kune.kunecli.cmds.UsersCount;
import cc.kune.kunecli.cmds.UsersDailySignInsCommand;
import cc.kune.kunecli.cmds.UsersLangStatsCommand;
import cc.kune.kunecli.cmds.UsersLastSignInsCommand;
import cc.kune.kunecli.cmds.UsersReindexCommand;
import cc.kune.kunecli.cmds.UsersSignInsStatsCommand;
import cc.kune.kunecli.cmds.WaveToDirCommand;
/**
* The Class KuneCliMain.
*
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
public class KuneCliMain {
private static Injector injector;
/** The Constant LOG. */
public static final Log LOG = LogFactory.getLog(KuneCliMain.class);
/** The Constant SERVICE_PREFFIX. */
public static String SERVER_PREFFIX = "http://127.0.0.1:8888";
public static String SERVICE_PREFFIX = setServicePrefix();
/**
* Inits the services.
*
* @throws MalformedURLException
* the malformed url exception
*/
private static void initServices() throws MalformedURLException {
// http://code.google.com/p/gwtrpccommlayer/wiki/GettingStarted
// http://googlewebtoolkit.blogspot.com.es/2010/07/gwtrpccommlayer-extending-gwt-rpc-to-do.html
final Injector partentInjector = Guice.createInjector(new Module() {
@Override
protected void configure() {
super.configure();
bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
}
});
final GwtRpcService service = partentInjector.getInstance(GwtRpcService.class);
injector = partentInjector.createChildInjector(new Module() {
@Override
protected void configure() {
try {
bind(UserServiceAsync.class).toInstance(
service.create(new URL(SERVICE_PREFFIX + "UserService"), UserServiceAsync.class));
bind(GroupServiceAsync.class).toInstance(
service.create(new URL(SERVICE_PREFFIX + "GroupService"), GroupServiceAsync.class));
bind(SocialNetServiceAsync.class).toInstance(service.create(
new URL(SERVICE_PREFFIX + "SocialNetService"), SocialNetServiceAsync.class));
bind(SiteServiceAsync.class).toInstance(
service.create(new URL(SERVICE_PREFFIX + "SiteService"), SiteServiceAsync.class));
bind(I18nServiceAsync.class).toInstance(
service.create(new URL(SERVICE_PREFFIX + "I18nService"), I18nServiceAsync.class));
bind(ContentServiceAsync.class).toInstance(
service.create(new URL(SERVICE_PREFFIX + "ContentService"), ContentServiceAsync.class));
bind(InvitationServiceAsync.class).toInstance(service.create(
new URL(SERVICE_PREFFIX + "InvitationService"), InvitationServiceAsync.class));
// TODO: Add its dependencies:
// bind(UpDownServiceAsync.class).toInstance(
// service.create(new URL(SERVICE_PREFFIX + "UpDownService"),
// UpDownServiceAsync.class));
} catch (final MalformedURLException e) {
LOG.error("Malformed URL", e);
}
};
});
}
/**
* The main method.
*
* @param args
* the arguments
* @throws InvalidSyntaxException
* the invalid syntax exception
* @throws ExecutionException
* the execution exception
* @throws MalformedURLException
* the malformed url exception
*/
public static void main(final String[] args)
throws InvalidSyntaxException, ExecutionException, MalformedURLException {
final String serverPrefix = System.getenv("KUNE_SERVER_URL");
if (serverPrefix != null) {
SERVER_PREFFIX = serverPrefix;
SERVICE_PREFFIX = setServicePrefix();
LOG.debug("Using server URL: " + SERVER_PREFFIX);
LOG.debug("Using service URL: " + SERVICE_PREFFIX);
}
initServices();
// TODO: integrate jline or similar?
// http://jline.sourceforge.net/index.html
// http://sourceforge.net/projects/javacurses/
// http://massapi.com/class/jcurses/widgets/Button.java.html
// Create an empty command set
final Set<Command> cs = new LinkedHashSet<Command>();
// Create the interpreter
final NaturalCLI nc = new NaturalCLI(cs);
// Add the commands that can be understood
cs.add(new HelpCommand(cs)); // help
cs.add(new HTMLHelpCommand(cs)); // htmlhelp
// A script can be useful for kune
cs.add(new ExecuteFileCommand(nc)); // execute file <filename:string>
// cs.add(new HelloWorldCommand());
// kune specific commands
cs.add(injector.getInstance(AuthCommand.class));
cs.add(injector.getInstance(SiteInviteCommand.class));
cs.add(injector.getInstance(SiteI18nStatsCommand.class));
cs.add(injector.getInstance(SiteReindexCommand.class));
cs.add(injector.getInstance(SiteReloadPropertiesCommand.class));
cs.add(injector.getInstance(GroupsCount.class));
cs.add(injector.getInstance(GroupsReindexCommand.class));
cs.add(injector.getInstance(UsersCount.class));
cs.add(injector.getInstance(UsersDailySignInsCommand.class));
cs.add(injector.getInstance(UsersLastSignInsCommand.class));
cs.add(injector.getInstance(UsersLangStatsCommand.class));
cs.add(injector.getInstance(UsersSignInsStatsCommand.class));
cs.add(injector.getInstance(UsersReindexCommand.class));
cs.add(injector.getInstance(WaveToDirCommand.class));
cs.add(injector.getInstance(DeltaMigrationToMongoCommand.class));
// As the return type of these commands are not java.io.Serializable (and
// instead GWT's IsSerializable) the return part of this cmds fails
// cs.add(injector.getInstance(GetInitDataCommand.class));
// cs.add(injector.getInstance(GetI18nLangCommand.class));
// Execute the command line
nc.execute(args, 0);
}
private static String setServicePrefix() {
return SERVER_PREFFIX + "/ws/";
}
}