001    /*
002     * Copyright (C) 2010 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    
020    package org.crsh.standalone;
021    
022    import com.sun.tools.attach.VirtualMachine;
023    import org.crsh.Processor;
024    import org.crsh.shell.impl.CRaSH;
025    import org.crsh.term.BaseTerm;
026    import org.crsh.term.Term;
027    import org.crsh.term.spi.jline.JLineIO;
028    import org.crsh.term.spi.net.TermIOServer;
029    
030    import java.net.*;
031    
032    /**
033     * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
034     * @version $Revision$
035     */
036    public class Main {
037    
038      public static void main(String[] args) throws Exception {
039    
040        if (args.length > 0) {
041          // Standalone
042          String id = args[0];
043          URL url = Main.class.getProtectionDomain().getCodeSource().getLocation();
044          java.io.File f = new java.io.File(url.toURI());
045          VirtualMachine vm = VirtualMachine.attach(id);
046    
047          TermIOServer server = new TermIOServer(new JLineIO(), 0);
048          int port = server.bind();
049          System.out.println("Bound on port " + port);
050    
051          //
052          System.out.println("Loading agent");
053          vm.loadAgent(f.getCanonicalPath(), "" + port);
054    
055          //
056          try {
057            server.accept();
058            while (server.execute()) {
059              //
060            }
061          } finally {
062            vm.detach();
063          }
064        } else {
065          final Bootstrap bootstrap = new Bootstrap(Thread.currentThread().getContextClassLoader());
066    
067          // Register shutdown hook
068          Runtime.getRuntime().addShutdownHook(new Thread() {
069            @Override
070            public void run() {
071              bootstrap.shutdown();
072            }
073          });
074    
075          // Do bootstrap
076          bootstrap.bootstrap();
077    
078          // Start crash for this command line
079          Term term = new BaseTerm(new JLineIO());
080          Processor processor = new Processor(term, new CRaSH(bootstrap.getContext()));
081    
082          //
083          processor.run();
084        }
085      }
086    }