Доступ к консоли MQL c удаленного клиента.

Новый уровень сотрудничества

Доступ к консоли MQL c удаленного клиента.

Сообщение Headless » 11 мар 2015 21:05

Уважаемые специалисты,
Поделитесь, пожалуйста, опытом по доступу к Mql консоли с удаленного клиента.
Есть, конечно приложения /enovia/tvc-action/MQLClient и его /enovia/tvc-action/ajax.
Но все эти штуки-дрюки требуют авторизации /enovia/servlet/login?login_name=user&login_password=password.
А есть желание с консоли вводить set context login password.
И раз уж я поднял этот вопрос, то к нему вдогонку: какие параметры кроме JSESSIONID клиент получает при аутентификации через бровзер?
Спасибо за внимание.
Headless
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 12 окт 2011 12:29

Re: Доступ к консоли MQL c удаленного клиента.

Сообщение Tr4k » 13 мар 2015 16:21

Удаленный коннект к эновии, насколько я знаю, возможен только по логину/паролю. В библиотеках для RMI просто нет другой возможности. Так что вводить их все равно надо. Как сама MQL консоль подключается к эновии никогда не интересовался, обходных путей не искал.

Когда-то давно работал с MxEclipse (или что-то подобное), в нем была MQL консоль, но подключение (адрес и логин/пароль) задавалось в настройках, так что в самой консоли вводить ничего не надо было. Но эклипс с плагинами будут несколько тяжеловесней консоли :-)

В самом начале своей работы с эновией делал утилитку для удаленной отсылки MQL команд. В результате была некая имитация MQL консоли но с удаленного клиента. Алгоритм в кратце: указываем хост для подключения, после чего спамим обычными MQL сообщениями (включая set context user бла бла бла). Результаты и ошибки команд печатаются опять же в консоли. По сути, было как раз некое замаскированное введение логина/пароля в виде "set context...". Насколько я помню, утилитка работала, но разрабатывалась еще в студенческие годы, так что нормального тестирования не было. Есть исходник, если надо - могу выложить.
Tr4k
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 01 окт 2012 11:54

Re: Доступ к консоли MQL c удаленного клиента.

Сообщение Headless » 16 мар 2015 16:07

Уважаемый Tr4k,
Спасибо за ответ. Правильно ли я понимаю, что MxEclipse - это плагин для IDE Eclipse?
Если не сложно, выложите, пожалуйста, исходники. Постараюсь сам разобраться и не задавать глупых вопросов :-)
Headless
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 12 окт 2011 12:29

Re: Доступ к консоли MQL c удаленного клиента.

Сообщение Tr4k » 16 мар 2015 17:26

Добрый день!

Да MxEclipse устанавливался как плагин на IDE. Судя по его страничке он уже давно не развивается, последнее обновление было в 2008 году. Но в удаленной работе с эновией с тех пор мало что изменилось, так что в каком-то виде работать должен. Страничка на проект: http://mxeclipse.sourceforge.net/index.html

Был еще некий MxUpdate, но он, как мне помнится, делал импорт/экспорт данных, MQL там вроде не было.

Исходник приложил. Для работы ему нужна библиотечка eMatrixServletRMI.jar из веб приложения Enovia. За работоспособность не отвечаю, давно это дело было :-) После беглого просмотра код выглядит довольно логично, но все может быть. Протестить, к сожалению, сейчас не могу, нет рабочей эновии на руках. Будут проблемы, обращайтесь, помогу чем смогу.

 Исходник :
Код: Выделить всё
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import matrix.db.Context;
import matrix.db.MQLCommand;
import matrix.util.MatrixException;

public class MQLClient {

   public static void main(String[] args) {
      try {
         BufferedReader in = new BufferedReader(new InputStreamReader(System.in) );
         boolean connectionSuccessful = false;
         while (!connectionSuccessful) { //выполняется пока не будет подключения к Enovia
            System.out.println("Enter Enovia host:");
            String host = in.readLine();
            boolean connectionStringFormatValid = false;
            String user = "";
            String password = "";
            while (!connectionStringFormatValid) {//выполняется пока не будет введена строка для подключения в правильном формате
               System.out.println("Please enter connection string: set context user PERSON password PASSWORD;");
               String connection = in.readLine();
               try {
                  if (connection.startsWith("set context user ") && connection.endsWith(";")) {
                     connection = connection.substring(17, connection.length());
                     int userEndPosition = connection.indexOf(" ");
                     if (userEndPosition != -1 && connection.contains(" password ")) {
                        user = connection.substring(0, userEndPosition);
                        connection = connection.substring(userEndPosition);
                        if (connection.startsWith(" password ")) {
                           password = connection.substring(10, connection.length());
                           connectionStringFormatValid = true;
                        }
                     }
                     else {
                        user = connection.substring(0, connection.length() - 1);
                        connectionStringFormatValid = true;
                     }
                     if (!connectionStringFormatValid) {
                        System.out.println("Wrong connection string format.");
                     }
                  }
               } catch (Exception e) {
                  System.out.println("Wrong connection string format.");
               }
            }
            try { //Подключение к Enovia
               Context ctx = new Context(host);
               ctx.setUser(user);
               ctx.setPassword(password);
               if (ctx.isConnected()) {
                  System.out.println("Connection successful. For exit type: 0");
                  connectionSuccessful = true;
                  String input = in.readLine();
                  while (!input.equals("0")) { //Выполнение MQL команд. Для выхода вводится "0"
                     while (!input.endsWith(";")) {
                        input = input + in.readLine();
                     }
                     MQLCommand cmd = new MQLCommand();
                     cmd.executeCommand(ctx, input);
                     if (!cmd.getResult().isEmpty()) {
                        System.out.println(cmd.getResult());
                     }
                     if (!cmd.getError().isEmpty()) {
                        System.out.println(cmd.getError());
                     }
                     input = in.readLine();
                  }
               }
               else {
                  System.out.println("Connection unsuccessful. Try again.");
               }
            } catch (MatrixException e) {
               System.out.println("Error:");
               e.printStackTrace();
            }
         }
         in.close();
         System.exit(0);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}
Tr4k
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 01 окт 2012 11:54

Re: Доступ к консоли MQL c удаленного клиента.

Сообщение Headless » 17 мар 2015 21:03

Уважаемый Tr4k,
Спасибо большое за ответ, всё заработало.
Я с программированием не очень-то знаком, поэтому не уверен, "нормальный" ли это стиль подключать библиотеки просто их копируя к себе? В смысле, должны же быть "точки входа" на сервер, с использованием стандартных библиотек?
Есть еще один маленький вопрос немного не по теме (не знаю, есть ли смысл выводить отдельную ветку):
Есть команда print mail в запросах mql: при ее выполнении выводятся все сообщения без разбора (прочитанные/непрочитанные). Ну и по железной логике IconMail тут же становятся прочитанными.
Есть ли какой-нибудь условие вывода только заголовков (или количества) без сброса флага U (unread)?
В документации описано это прям скажем слабенько.
Спасибо за внимание =)
Headless
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 12 окт 2011 12:29

Re: Доступ к консоли MQL c удаленного клиента.

Сообщение Tr4k » 18 мар 2015 13:25

Добрый день.

Когда создается удаленный клиент для работы по RMI, ему для доступа нужна клиентская библиотека. При обращении к методам библиотеки происходит примерно следующее: формируется запрос на сервер, сервер выполняет необходимый метод и возвращает его результат. В результате нам кажется, что мы из клиента обрабатываем данные теми же методами, что и на сервере. Ну это если условно :-) Так что копирование эновийных библиотек вполне нормально, они для этого и предназначены.

С IconMail полноценно не работал, могу только предполагать. Можно попробовать из результатов работы команды MQL вычленить идентификаторы IconMail сообщения и программно возвращать им флаг unread. Пример ниже:

 IconMail :
Код: Выделить всё
IconMailList mailLst = IconMail.getMail(ctx);//получение списка всех сообщений IconMail
IconMailItr mailItr = new IconMailItr(mailLst);//итератор по списку сообщений
while (mailItr.next()) {
   IconMail mail = mailItr.obj();
   if (mail.getSubject().equals("subject")) {//проверка что сообщение нужное, проверки по Subject врядли достаточно, нужны дополнительные
      mail.markAsUnRead();//пометка как непрочитанное
   }
}

Есть ли флаги для MQL команды не знаю.
Tr4k
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 01 окт 2012 11:54

Re: Доступ к консоли MQL c удаленного клиента.

Сообщение Headless » 20 мар 2015 21:24

Спасибо большое!
Я думаю, что разобрался.
Headless
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 12 окт 2011 12:29


Вернуться в ENOVIA V6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3