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 }