Script

Pessoal,

 
Penso em produzir um script em um point de um meta data sourceentão segui lendo sobre Rhino e minha pergunta esta baseada no seguinte conceito: Rhino me permiti rodar java script no server-side ( ScadaBR).  
Tenho uma segunda aplicação web, na qual produzi um RESTful, esta aplicação tem um BD com uma tabela "person" e através do browser posso realizar: GETPOSTPUT e DELETE da seguinte forma (GET):
então recebo o retorno:
  • <?xml version="1.0" encoding="UTF-8"?><document><name>Dadatota</name><birthdate>2008-04-28</birthdate><id>1</id></document>
onde Dadatota é o nome com id=1 da tabela person
Assim posso realizar um CRUD na tabela "person".
 
Como este é meu primeiro contato com JS e Rhino, fiz varias tentativas de construir um script sem sucesso. Minha ideia é que uma var receba o xml, então faço algo como um RegEX  e obtenho o dado desejado:
Sou iniciante em todos esses conceitos, logo correções são bem vindas.
Qualquer ajuda? 
 

 

OK,  consegui  atingir o objetivo, então vou descrever o caminho que segui:

Conceitos:

  •  Rhino é uma implementação em Java do Interpretador JavaScript.  
  • ·Interpretador JavaScript, normalmente são embutidos nos Browser’s(side-client), assim  pode-se customizar o comportamento do Browser.
  • Com a motivação de permitir os usuários customizar o comportamento de uma aplicação em Java, pode-se embutir na aplicação o interpretador JavaScrip, sendo no caso de  aplicação Java deve-se usar a implementação do interpretador  produzida em Java, o Rhino.
  • Com o Rhino embutido na aplicação Java você pode interagir com objetos Java, fazendo get e set nos fields e chamando os métodos do objeto Java.
  • ScadaBR é uma aplicação Java com o Rhino embutido, logo tem a capacidade de “scripting”.
  • Assim, você tem JavaScript rodando no server-side.
  • Para usar TODO o potencial de script no ScadaBR, e necessário o conhecimento de JavaScript AND Java. AND  como função lógica.
  • O simbolo global Packages prove acesso a todos os pacotes Java que o interpretador JavaScript conhece.

Solução:

  • Packages.java;
  • // para importar um pacote Java use importPackage()
  • importPackage(java.net);
  • importPackage(java.io);
  • var e = new MalformedURLException();
  • var search = "";
  • search += card.value;
  • try{
  • ·          var urlBase = new URL("http://192.168.1.3/myapp/default/");
  • ·          var url= new URL(urlBase,("get_person/"+search +".json"));
  • //Observe que mudei a extensão  da URL para json, porque jsom é mais rapido e mais fácil que xml. O retorno em json: {"name": "Dadatota", "birthdate": "2008-04-28", "id": 1}
  • ·         var urlStream = url.openStream();
  • ·         var stream = new InputStreamReader(urlStream,"US-ASCII");
  • }
  • catch ( e) {
  •            return "NG";
  • }
  • var response ="";
  •  var i = 0;
  • while(stream.ready()>0){
  •          response +=  String.fromCharCode(stream.read());
  •          i++;
  • }
  • urlStream.close();
  • // Neste ponto há uma forma elegante de recuperar o valor Dadatota considerando que response esta no formato json, entretanto após  implementado, de forma aleatória retorna SyntaxError, então resolvi com manipilação de strings.
  • var startFiledValue = response.search(":");
  • var endFieldValue = response.length;
  • var str = response.slice(startFiledValue+3,endFieldValue);
  • endFieldValue =  str.search('"');
  • var str1 = str.slice(0,endFieldValue);
  • return str1 ;

Segue código usando o potencial de json para interagir com response:

  • Packages.java;
  • importPackage(java.net);
  • importPackage(java.io);
  • var e = new MalformedURLException();
  • var search = "";
  • search += card.value;
  • try{
  • ·         var urlBase = new URL("http://192.168.1.3/myapp/default/");
  • ·         var url= new URL(urlBase,("get_person/"+search +".json"));
  • ·         var urlStream = url.openStream();
  • ·         var stream = new InputStreamReader(urlStream,"US-ASCII");
  • }
  • catch ( e) {
  •          return "NG";
  • }
  • var response ="";
  • var i = 0;
  • while(stream.ready()>0){
  •           response +=  String.fromCharCode(stream.read());
  • ·         i++;
  • }
  • urlStream.close();
  • //Script error: SyntaxError: syntax error (#34(eval)#1) in #34(eval) at line number 1 in //#34(eval) at line number 1
  • var obj = eval ("(" + response + ")");
  • return obj.name
  • //muito mais elegante!

Assim, espero contribuir para aqueles, que como eu, percebe o potencial do script  e não tem profundo conhecimento nas linguagens JavaScript e Java, de tal forma que pelo beneficio, compensa tentar apreender um pouco mais, e o exemplo mostra o inicio do caminho.  

 

    

 

Olá Vicente, 

Parabéns! Fantástica sua implementação. 

Fica como um ótimo exemplo para os usuários do ScadaBR sobre o poder do ServerSideScript =]

Nós temos uma maneira mais humilde de fazer um GET/POST via http através dos data sources HTTP Receiver e Retriever, e pelo Publisher HTTP;

Mas adoramos sua idéia.

Att.

Obrigado.

No inicio eu havia tentado a maneira mais humilde:

http://192.168.1.3/myapp/default/get_person/1.json, onde aqui search = 1, entretanto tendo search como variavel para o desejado GET, usando data source do tipo HTTP Receiver, a variavel acaba sendo constante, assim eu deveria criar tantos HTTP Receiveirs quantos fossem necessários e tendo muitas necessidades abandonei a abordagem e resolvi entender o poder do SCRIPT. 

Olá,

Eu estou tentando escrever uma variável modbus utilizando um FORM post ou get na própria view do ScadaBR.

Para isso eu criei uma variável Receptor HTTP, e criei uma variável que pretendo escrever utilizando um formulário para melhorar a aparência, e posteriormente utilizar o server-side script para linkar as duas.

Porém não estou conseguindo fazer o form funcionar, eu até consigo escrever a variável, mas não encontrei um maneira de me manter na mesma página, sem recarregar nada.

<FORM METHOD=GET ACTION="http://192.168.0.100:8080/ScadaBR/httpds?">
Novo Valor: <INPUT NAME="meuVarHTTP"><BR>
<INPUT TYPE=SUBMIT>
</FORM>

Olá

Descobri que o que eu queria fazer estava errado. Era muito mais fácil fazer utilizando um serverside script direto para a variável!

De qualqeur forma, obrigado!

Amigos, especialmente o vicente,

coloquei outro post sobre acessar dados de um equipamento via http post usando autenticação no formato json.

dá uma olhada, quem sabe não pode ajudar.