001/*
002 * Copyright (C) 2012 eXo Platform SAS.
003 *
004 * This is free software; you can redistribute it and/or modify it
005 * under the terms of the GNU Lesser General Public License as
006 * published by the Free Software Foundation; either version 2.1 of
007 * the License, or (at your option) any later version.
008 *
009 * This software is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * You should have received a copy of the GNU Lesser General Public
015 * License along with this software; if not, write to the Free
016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018 */
019
020package org.crsh.shell.impl.command;
021
022import org.crsh.lang.LanguageCommandResolver;
023import org.crsh.lang.spi.Language;
024import org.crsh.shell.impl.command.spi.Command;
025import org.crsh.shell.impl.command.spi.CommandException;
026import org.crsh.shell.impl.command.spi.CommandResolver;
027import org.crsh.plugin.PluginContext;
028import org.crsh.shell.impl.command.system.SystemResolver;
029
030import java.security.Principal;
031import java.util.ArrayList;
032import java.util.LinkedHashMap;
033import java.util.Map;
034
035public class CRaSH {
036
037  /** . */
038  final PluginContext context;
039
040  /** . */
041  final LanguageCommandResolver scriptResolver;
042
043  /** . */
044  private final ArrayList<CommandResolver> resolvers = new ArrayList<CommandResolver>();
045
046  /** . */
047  final ArrayList<Language> langs = new ArrayList<Language>();
048
049  /**
050   * Create a new CRaSH.
051   *
052   * @param context the plugin context
053   * @throws NullPointerException if the context argument is null
054   */
055  public CRaSH(PluginContext context) throws NullPointerException {
056    this.context = context;
057    this.scriptResolver = new LanguageCommandResolver(context);
058
059    // Add the resolver plugins
060    for (CommandResolver resolver : context.getPlugins(CommandResolver.class)) {
061      resolvers.add(resolver);
062    }
063    for (Language lang : context.getPlugins(Language.class)) {
064      if (lang.isActive()) {
065        langs.add(lang);
066      }
067    }
068
069    //
070    resolvers.add(scriptResolver);
071    resolvers.add(SystemResolver.INSTANCE);
072  }
073
074  public CRaSHSession createSession(Principal user) {
075    return new CRaSHSession(this, user);
076  }
077
078  /**
079   * Returns the plugin context.
080   *
081   * @return the plugin context
082   */
083  public PluginContext getContext() {
084    return context;
085  }
086
087  /**
088   * Attempt to obtain a command instance. Null is returned when such command does not exist.
089   *
090   * @param name the command name
091   * @return a command instance
092   * @throws org.crsh.shell.impl.command.spi.CommandException if an error occured preventing the command creation
093   * @throws NullPointerException if the name argument is null
094   */
095  public Command<?> getCommand(String name) throws CommandException, NullPointerException {
096    if (name == null) {
097      throw new NullPointerException("No null name accepted");
098    }
099    for (int i = 0;i < resolvers.size();i++) {
100      Command<?> command = resolvers.get(i).resolveCommand(name);
101      if (command != null) {
102        return command;
103      }
104    }
105    return null;
106  }
107
108  public Iterable<Map.Entry<String, String>> getCommands() {
109    LinkedHashMap<String, String> names = new LinkedHashMap<String, String>();
110    for (int i = 0;i < resolvers.size();i++) {
111      for (Map.Entry<String, String> entry : resolvers.get(i).getDescriptions()) {
112        names.put(entry.getKey(), entry.getValue());
113      }
114    }
115    return names.entrySet();
116  }
117}