import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Ortek
*/
public abstract class Terminal
{
private StringBuilder directorio, directorioNoExiste, mostrarSalidaTerminal;
private String cs, shell, argumentoShell;
private Process terminal;
private ProcessBuilder ejecutarComandos;
private File fileDirectorio;
private BufferedReader salidaCorrectaConsola, salidaErrorConsola;
public Terminal() throws IOException
{
identificarSO();
directorio = new StringBuilder( System.getProperty( "user.home" ) );
mostrarSalidaTerminal = new StringBuilder();
directorioNoExiste = new StringBuilder();
ejecutarComandos = new ProcessBuilder( shell );
fileDirectorio = new File( directorio.toString() );
terminal = ejecutarComandos.start();
ejecutarComandos.directory( fileDirectorio );
}
public abstract String getErrorCarpeta( String carpeta );
public StringBuilder getDirectorioNoExiste()
{
return directorioNoExiste;
}
public StringBuilder getmMstrarSalidaTerminal()
{
return mostrarSalidaTerminal;
}
public void setCS( String cs )
{
this.cs = cs;
}
public void setShell( String shell )
{
this.shell = shell;
}
public void setArgumentoShell( String argumentoShell )
{
this.argumentoShell = argumentoShell;
}
public void setDirectorioNoExiste()
{
this.directorioNoExiste = null;
}
public void inicializarMostrarSalidaTerminal()
{
mostrarSalidaTerminal = new StringBuilder();
}
public abstract void identificarSO() throws IOException;
public void leerSalidaTerminal() throws IOException
{
String linea;
mostrarSalidaTerminal = new StringBuilder();
salidaCorrectaConsola = new BufferedReader( new InputStreamReader( terminal.getInputStream(), cs ) ); // Cp850 para windows
while ( ( linea = salidaCorrectaConsola.readLine() ) != null )
{
mostrarSalidaTerminal.append( linea );
mostrarSalidaTerminal.append( "\n" );
}
salidaErrorConsola = new BufferedReader( new InputStreamReader( terminal.getErrorStream(), cs ) ); // Cp850 para windows
while ( ( linea = salidaErrorConsola.readLine() ) != null )
{
mostrarSalidaTerminal.append( linea );
mostrarSalidaTerminal.append( "\n" );
}
}
public void analizarComando( String comando ) throws IOException
{
String[] comandoSeparado = comando.split( " " );
if ( comandoSeparado[ 0 ].equals( "cd" ) )
{
if ( comandoSeparado[ 1 ].equals( ".." ) )
{
if ( fileDirectorio.getParentFile() != null )
{
directorio = new StringBuilder( String.valueOf( fileDirectorio.getParentFile() ) );
fileDirectorio = new File( directorio.toString() );
ejecutarComandos.directory( fileDirectorio );
}
}
else
{
StringBuilder directorioAux= new StringBuilder( directorio );
directorioAux.append( "/" );
directorioAux.append( comandoSeparado[ 1 ] );
File fileDirectorioAux = new File( directorioAux.toString() );
if( fileDirectorioAux.exists() )
{
directorio.append( "/" );
directorio.append( comandoSeparado[ 1 ] );
fileDirectorio = fileDirectorioAux;
ejecutarComandos.directory( fileDirectorio );
}
else
{
directorioNoExiste = new StringBuilder();
directorioNoExiste.append( getErrorCarpeta( comandoSeparado[ 1 ] ) );
}
}
}
else
{
otrosComandos( comandoSeparado );
}
}
public abstract void otrosComandos( String[] comandoSeparado ) throws IOException;
public void ejecutarComandoMac( String[] comandoSeparado ) throws IOException
{
ejecutarComandos.command( listarComando( comandoSeparado, shell ) );
terminal = ejecutarComandos.start();
leerSalidaTerminal();
}
public void ejecutarComandoWindows( String[] comandoSeparado ) throws IOException
{
ejecutarComandos.command( listarComando( comandoSeparado, shell, argumentoShell ) );
terminal = ejecutarComandos.start();
leerSalidaTerminal();
}
public void ejecutarComandoLinux( String[] comandoSeparado ) throws IOException
{
StringBuilder comando = new StringBuilder();
for( int i = 0; i < comandoSeparado.length; i++ )
{
comando.append( comandoSeparado[ i ] );
if( i < ( comandoSeparado.length - 1 ) )
{
comando.append( " " );
}
}
ejecutarComandos.command( shell, argumentoShell, comando.toString() );
terminal = ejecutarComandos.start();
}
public List<String> listarComando( String[] comandoSeparado, String shell )
{
List<String> listaComando = new ArrayList<String>();
listaComando.add( shell );
for ( int i = 0; i < comandoSeparado.length; i++ )
{
listaComando.add( comandoSeparado[ i ] );
}
return listaComando;
}
public List<String> listarComando( String[] comandoSeparado, String shell, String argumentoShell )
{
List<String> listaComando = new ArrayList<String>();
listaComando.add( shell );
listaComando.add( argumentoShell );
for ( int i = 0; i < comandoSeparado.length; i++ )
{
listaComando.add( comandoSeparado[ i ] );
}
return listaComando;
}
}
import java.io.IOException;
/**
*
* @author Ortek
*/
public class TerminalLinux extends Terminal
{
public TerminalLinux() throws IOException
{
super();
}
@Override
public void identificarSO() throws IOException
{
setCS( "UTF-8" );
setShell( "sh" );
setArgumentoShell( "-c" );
}
@Override
public void otrosComandos( String[] comandoSeparado ) throws IOException
{
ejecutarComandoLinux( comandoSeparado );
}
@Override
public String getErrorCarpeta( String carpeta )
{
StringBuilder mensajeErrorCarpeta = new StringBuilder();
mensajeErrorCarpeta.append( "-bash: cd: " );
mensajeErrorCarpeta.append( carpeta );
mensajeErrorCarpeta.append( ": No such file or directory\n" );
return mensajeErrorCarpeta.toString();
}
}
import java.io.IOException;
/**
*
* @author Ortek
*/
public class TerminalMac extends Terminal
{
public TerminalMac() throws IOException
{
super();
}
@Override
public void identificarSO() throws IOException
{
setCS( "UTF-8" );
setShell( "command" );
}
@Override
public void otrosComandos( String[] comandoSeparado ) throws IOException
{
ejecutarComandoMac( comandoSeparado );
}
@Override
public String getErrorCarpeta( String carpeta )
{
StringBuilder mensajeErrorCarpeta = new StringBuilder();
mensajeErrorCarpeta.append( "-bash: cd: " );
mensajeErrorCarpeta.append( carpeta );
mensajeErrorCarpeta.append( ": No such file or directory\n" );
return mensajeErrorCarpeta.toString();
}
}
import java.io.IOException;
/**
*
* @author Ortek
*/
public class TerminalWindows extends Terminal
{
public TerminalWindows() throws IOException
{
super();
}
@Override
public void identificarSO() throws IOException
{
setCS( "Cp850" );
setShell( "cmd" );
setArgumentoShell( "/C" );
}
@Override
public void otrosComandos( String[] comandoSeparado ) throws IOException
{
ejecutarComandoWindows( comandoSeparado );
}
@Override
public String getErrorCarpeta( String carpeta )
{
return "El sistema no pudo encontrar la ruta especifica.";
}
}
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
*
* @author Ortek
*/
public class Ventana extends JFrame
{
private static final long serialVersionUID = 1L;
private JTextArea areaTerminal;
private JTextField entradaComandos;
private JScrollPane scrollAreaComandos;
private JButton enviarComandos;
private Terminal ter;
public Ventana()
{
super( "Terminal" );
setLayout( new GridBagLayout() );
areaTerminal = new JTextArea();
scrollAreaComandos = new JScrollPane( areaTerminal );
entradaComandos = new JTextField( 50 );
enviarComandos = new JButton( "Enviar" );
try
{
String so = System.getProperty( "os.name" );
if ( so.contains( "Windows" ) )
{
ter = new TerminalWindows();
}
else if ( so.contains( "Mac" ) )
{
ter = new TerminalMac();
}
else
{
ter = new TerminalLinux();
}
}
catch ( IOException e1 )
{
e1.printStackTrace();
}
areaTerminal.setEditable( false );
enviarComandos.addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
mandarComandos();
}
} );
entradaComandos.addKeyListener( new KeyAdapter()
{
@Override
public void keyReleased( KeyEvent e )
{
if ( e.getKeyCode() == 10 )
{
mandarComandos();
}
}
} );
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 2;
gbc.gridheight = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
add( scrollAreaComandos, gbc );
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
add( entradaComandos, gbc );
gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
add( enviarComandos, gbc );
setSize( 720, 480 );
setLocationRelativeTo( null );
setDefaultCloseOperation( EXIT_ON_CLOSE );
setVisible( true );
}
public void mandarComandos()
{
areaTerminal.append( "> " );
areaTerminal.append( entradaComandos.getText() );
areaTerminal.append( "\n" );
try
{
ter.analizarComando( entradaComandos.getText() );
areaTerminal.append( ter.getmMstrarSalidaTerminal().toString() );
}
catch ( IOException e )
{
e.printStackTrace();
}
ter.inicializarMostrarSalidaTerminal();
if ( ter.getDirectorioNoExiste() != null )
{
areaTerminal.append( ter.getDirectorioNoExiste().toString() );
ter.setDirectorioNoExiste();
}
areaTerminal.append( "\n" );
entradaComandos.setText( "" );
}
public static void main( String[] args )
{
new Ventana();
}
}