Executar um comando no servidor

Pessoal…

Estou implementando um sistema de pagamento por cartão de credito de uma loja virtual, estamos usando a operadora Redecard.
O problema é o seguinte:

Em uma das etapas preciso gerar um codigo de verificação da compra, a redecard me passou uma classe java (CodVer.class) que gera esse codigo de verificação, então precisso que meu servlet execute essa classe no servidor e me retorne um arquivo(codver.out) para que eu possa ler esse arquivo e colocar o codigo de verificação gerado no formulario de envio para a operadora.

Runtime.getRuntime().exec("cmd /c java CodVer "+ numfil+ " "+ total+ " "+ ipAdress + " > codver.out");

Com esse codigo consigo gerar o cod verificação e depois é so ler o arquivo gerado, isso usando jse. Mas quando tento fazer esse comando com o tomcat nao consigo gerar o codigo.

Então a pergunta é, como fazer isso no servidor??

grato

pq vc simplesmente num roda a classe no servlet e usa java.io.* para ler o arquivo?

[quote=brunoacpc]Pessoal…

Estou implementando um sistema de pagamento por cartão de credito de uma loja virtual, estamos usando a operadora Redecard.
O problema é o seguinte:

Em uma das etapas preciso gerar um codigo de verificação da compra, a redecard me passou uma classe java (CodVer.class) que gera esse codigo de verificação, então precisso que meu servlet execute essa classe no servidor e me retorne um arquivo(codver.out) para que eu possa ler esse arquivo e colocar o codigo de verificação gerado no formulario de envio para a operadora.

Runtime.getRuntime().exec("cmd /c java CodVer "+ numfil+ " "+ total+ " "+ ipAdress + " > codver.out");

Com esse codigo consigo gerar o cod verificação e depois é so ler o arquivo gerado, isso usando jse. Mas quando tento fazer esse comando com o tomcat nao consigo gerar o codigo.

Então a pergunta é, como fazer isso no servidor??

grato[/quote]

É muito “bizarro” o que você está tentando fazer (dar um exec uma classe em java dentro de um código java). Não dá para instanciar a classe e chamar o metodo que gera o output?

é pessoal acho que é isso ai msm… alguem pode me dar um exemplo qe como faço isso??

grato

Experimente fazer isso com um programa mais simples, do tipo “Hello, world”.

a) Guarde o “standard output”
b) Abra um arquivo de saída e redirecione a saída padrão com System.setOut
c) Crie um array de strings, que são os parâmetros para main()
d) Chame CodVer.main() com o tal array
e) Feche o tal arquivo de saída.
f) Recupere o “standard output” obtido no passo a).

[quote=brunoacpc]é pessoal acho que é isso ai msm… alguem pode me dar um exemplo qe como faço isso??

grato

[/quote]

Lendo…

    try {
        BufferedReader in = new BufferedReader(new FileReader("infilename"));
        String str;
        while ((str = in.readLine()) != null) {
            process(str);
        }
        in.close();
    } catch (IOException e) {
    }

Escrevendo…


try {
        BufferedWriter out = new BufferedWriter(new FileWriter("outfilename"));
        out.write("aString");
        out.close();
    } catch (IOException e) {
    }

[quote=thingol]Experimente fazer isso com um programa mais simples, do tipo “Hello, world”.

a) Guarde o “standard output”
b) Abra um arquivo de saída e redirecione a saída padrão com System.setOut
c) Crie um array de strings, que são os parâmetros para main()
d) Chame CodVer.main() com o tal array
e) Feche o tal arquivo de saída.
f) Recupere o “standard output” obtido no passo a).
[/quote]

Peça o javadoc e/ou alguma documentação sobre a classe para o fornecedor. Acho o cumulo fazer integração “coorporativa” sem que o fornecedor mande pelo menos o javadoc da classe. Não é possivel que o unico jeito de usar a classe seja chamando o main. E pior ainda a unica saida seja o “standard output”. Se der pau você vai ter que fazer parser do arquivo de saida?

é veio sem documentação…

thingol, poderia dar exmplo de como faço isso que vc falou???

Tou achando que deve haver uma forma alternativa de usar esse CodVer. Se você carregar o tal cara no Eclipse é possível ver que métodos essa classe tem?

carreguei no netbeans e nada…

Que código esquisito…


import java.util.Date;

class CodVer {
	public static void main(String[] args) {
		Date date = new Date();
		if (args.length &lt 3) {
			System.out
					.println("Numero de argumentos invalidos!\n\nUso:java CodVer <numfil> <total> <endereco ip remoto>");
			System.out
					.println("\n<numfil>: Numero de filiacao\n<total>: Valor total da compra\n<endereo ip remoto>: IP Address do browser cliente");
		} else {
			for (int i = 0; i &lt args.length; i++) {
				/* empty */
			}
			int numfil = 0;
			try {
				numfil = Integer.parseInt(args[0]);
			} catch (Exception exception) {
				System.out.println("Erro - Numero de filiacao invalido.");
			}
			int total = 0;
			try {
				String parteInteira = args[1]
						.substring(0, args[1].indexOf('.'));
				total = Integer.parseInt(parteInteira);
			} catch (Exception exception) {
				System.out.println("Erro - Preco invalido. Use: ####.##");
				System.exit(-1);
			}
			int segundosAgora = date.getSeconds();
			int segundosAgoraCodificados = 0;
			switch (segundosAgora) {
			case 0:
				segundosAgoraCodificados = 11;
				break;
			case 1:
				segundosAgoraCodificados = 17;
				break;
			case 2:
				segundosAgoraCodificados = 21;
				break;
			case 3:
				segundosAgoraCodificados = 31;
				break;
			case 4:
				segundosAgoraCodificados = 56;
				break;
			case 5:
				segundosAgoraCodificados = 34;
				break;
			case 6:
				segundosAgoraCodificados = 42;
				break;
			case 7:
				segundosAgoraCodificados = 3;
				break;
			case 8:
				segundosAgoraCodificados = 18;
				break;
			case 9:
				segundosAgoraCodificados = 13;
				break;
			case 10:
				segundosAgoraCodificados = 12;
				break;
			case 11:
				segundosAgoraCodificados = 18;
				break;
			case 12:
				segundosAgoraCodificados = 22;
				break;
			case 13:
				segundosAgoraCodificados = 32;
				break;
			case 14:
				segundosAgoraCodificados = 57;
				break;
			case 15:
				segundosAgoraCodificados = 35;
				break;
			case 16:
				segundosAgoraCodificados = 43;
				break;
			case 17:
				segundosAgoraCodificados = 4;
				break;
			case 18:
				segundosAgoraCodificados = 19;
				break;
			case 19:
				segundosAgoraCodificados = 14;
				break;
			case 20:
				segundosAgoraCodificados = 9;
				break;
			case 21:
				segundosAgoraCodificados = 20;
				break;
			case 22:
				segundosAgoraCodificados = 23;
				break;
			case 23:
				segundosAgoraCodificados = 33;
				break;
			case 24:
				segundosAgoraCodificados = 58;
				break;
			case 25:
				segundosAgoraCodificados = 36;
				break;
			case 26:
				segundosAgoraCodificados = 44;
				break;
			case 27:
				segundosAgoraCodificados = 5;
				break;
			case 28:
				segundosAgoraCodificados = 24;
				break;
			case 29:
				segundosAgoraCodificados = 15;
				break;
			case 30:
				segundosAgoraCodificados = 62;
				break;
			case 31:
				segundosAgoraCodificados = 25;
				break;
			case 32:
				segundosAgoraCodificados = 34;
				break;
			case 33:
				segundosAgoraCodificados = 59;
				break;
			case 34:
				segundosAgoraCodificados = 37;
				break;
			case 35:
				segundosAgoraCodificados = 45;
				break;
			case 36:
				segundosAgoraCodificados = 6;
				break;
			case 37:
				segundosAgoraCodificados = 25;
				break;
			case 38:
				segundosAgoraCodificados = 16;
				break;
			case 39:
				segundosAgoraCodificados = 27;
				break;
			case 40:
				segundosAgoraCodificados = 63;
				break;
			case 41:
				segundosAgoraCodificados = 26;
				break;
			case 42:
				segundosAgoraCodificados = 35;
				break;
			case 43:
				segundosAgoraCodificados = 60;
				break;
			case 44:
				segundosAgoraCodificados = 38;
				break;
			case 45:
				segundosAgoraCodificados = 46;
				break;
			case 46:
				segundosAgoraCodificados = 7;
				break;
			case 47:
				segundosAgoraCodificados = 26;
				break;
			case 48:
				segundosAgoraCodificados = 17;
				break;
			case 49:
				segundosAgoraCodificados = 28;
				break;
			case 50:
				segundosAgoraCodificados = 14;
				break;
			case 51:
				segundosAgoraCodificados = 36;
				break;
			case 52:
				segundosAgoraCodificados = 2;
				break;
			case 53:
				segundosAgoraCodificados = 39;
				break;
			case 54:
				segundosAgoraCodificados = 47;
				break;
			case 55:
				segundosAgoraCodificados = 8;
				break;
			case 56:
				segundosAgoraCodificados = 29;
				break;
			case 57:
				segundosAgoraCodificados = 22;
				break;
			case 58:
				segundosAgoraCodificados = 55;
				break;
			case 59:
				segundosAgoraCodificados = 33;
				break;
			}
			segundosAgora = segundosAgoraCodificados;
			String pad;
			if (segundosAgora &lt 10)
				pad = "0";
			else
				pad = "";
			String ipremoto = args[2];
			int tamIP = ipremoto.length();
			int i_5_ = total + segundosAgora;
			int i_6_ = segundosAgora + tamIP;
			int i_7_ = segundosAgora * numfil;
			String string_8_ = String.valueOf(i_7_);
			System.out.print(String.valueOf(i_7_) + "" + i_5_ + "" + i_6_ + "-"
					+ string_8_.length() + pad + segundosAgora);
			int i_9_ = i_7_ / segundosAgora;
		}
	}
}

Acho que eles devem abrir uma vaga de programador java na Redecard.ehehehe

Putz!!! E não é só tem o metodo main mesmo. Que porcaria.
Por isso que não tem documentação mesmo. Nota 0 para quem fez este código. Onde já se viu que a unica forma de integração de um class e executando a classe. Por isso que integração é sempre uma %&$##@.

Bem, o jeito é fazer o que o thingol escreveu chamando o metodo main. Só que se der erro, você vai ter a maior dor de cabeça, pois o vai ter fazer parser do output, pois nem System.exit com código de erro foi setado.

[edit]Depois que eu vi que pelo menos em um caso o System.exit é setado para -1[/edit]

Uma saida seria você implementar o código, mas não seria muito etico. :slight_smile:

vixxxx…nem fale… valeu cara, agora fica mais facil pra min tenta entender…

rssss…acho que voui fazer isso mesmo oyama, nao seria etico mas e essa inhaca ai que eles fizeram justifica…

Eu tive um problema parecido para implementar a forma de pagamento do Itau (transferencia).
Eu peguei o class que ele enviaram, descompilei e criei uma classe usando a classe descompilada, e ao invés de gerar um arquivo com o código eu simplesmente retornava o valor do código pelo método.
Assim você evita de fazer o bizzaro System.exec

:wink:

Vc não pode fazer isso. Se a instituição responsavel pelo codigo lhe mandou o arquivo, no ditado popular “se vira e usa” =).[/quote]

Também acho que você deveria procurar a redecard e tentar negociar a mudança desta classe. Só de ter um metodo static (com as coisas que estão no main, sem os System.output) que retorna exception em caso de erro, já vai te ajudar muito. :slight_smile:

O cara que escreveu a classe nunca ouviu falar em orientação à objetos… hehhee

Vocês tem razão, o código é uma merda…masrealmente não posso pegar descompilar o codigo e modificar. Vou conversar com o pessoal da redecard sobre isso, acho que é a coisa mais correta no momento.

Valeu pela ajuda de todos!

Vc não pode fazer isso. Se a instituição responsavel pelo codigo lhe mandou o arquivo, no ditado popular “se vira e usa” =).