Побудова “товстого” Java-клієнта, який повністю інтегрований з Google Talk, Інші СУБД, Бази даних, статті

Як стало абсолютно ясно на виставці Oracle OpenWorld 2007, концепції та тенденції інтеграції Web 2.0 з додатками рівня підприємства є сьогодні головним напрямком в розробці додатків. Додатки Oracle Fusion Applications пропонують хороший приклад того, як об’єднання дуже привабливих, візуально багатих користувальницьких інтерфейсів з популярними можливостями Інтернету, наприклад, соціальні закладки (social bookmarking) і миттєвий обмін повідомленнями (IM – instant messaging), призводить до ефективних і продуктивним додатків. Об’єднане в інтерфейсі програми взаємодію є важливим фактором при спільній роботі, яку просуває цей новий стиль додатків. Електронна пошта (e – mail), голосовий зв’язок по IP (VoIP) і служба коротких повідомлень (SMS) – все це входить в число потенційно розглянутих каналів комунікації, але IM (чат) цілком може бути найпотужнішим серед них.

Рассмотриваются у статті навчальна програма предначена для демонстрації розробки повнофункціонального Web-додатки, яке повністю інтегровано з Google Talk (Http://www.google.com/talk/), одним з головних сервісів IM. Проект з відкритим вихідним текстом Smack пропонує бібліотеку API Java, щоб підключитися до протоколу Extensible Messaging and Presence Protocol (XMPP) – комунікаційним протоколам IM. Використовуючи Smack, можна дуже швидко створити Java-додаток, який розмовляє з Google Talk (і слухає його), або з будь-яким іншим сервісом IM, який відповідає технічним вимогам XMPP. Потім можна використовувати Oracle ADF Faces Rich Client (Який на момент написання цієї статті був частиною Oracle JDeveloper 11 g Technical Preview), щоб створити користувальницький інтерфейс і, зокрема, Active Data Service (Обслуговування активних даних), який робить можливим миттєві оновлення Web-клієнта (“проштовхування” з сервера на браузер) при отриманні повідомлення. І, нарешті, можливість перетягування “товстого” клієнта Oracle ADF Faces використовується для швидкого скидання записів даних у повідомлення чату.


Повністю файли проекту і програми-приклади для кожної частини навчальної програми доступні за адресою www.oracle.com/technology/pub/files/jellema-googtalk-project.zip .


Підготовка



Частина 1: Створення Java-додатка, що розмовляє з Google Talk


Налаштування Smack і підключення до Google Talk для програмованих чатів (читання і відправлення повідомлень)


Запустіть Oracle JDeveloper 11 g. Створіть новий додаток – і назвіть його, наприклад, GoogleTalk. Також створіть новий проект; наприклад, GoogleTalkJavaClient.


Виберіть з меню Application Template No Template [ All Technologies ] . З меню, що викликається натисненням правої кнопки миші, або з меню Tools відкрийте вікно діалогу Project Properties для вузла Project. Перейдіть до вузла Libraries and Classpath.


Додайте до проекту архівні файли smack. jar і smackx. jar: клікніть по кнопці Add JAR / Directory . Перегляньте бібліотеки та файли Smack, виберіть обидва файли (і smack . jar , і smackx . jar ) І клацніть по кнопці Select .


Файл JAR буде додано до проекту.


Клацніть по кнопці OK .


Тепер ми створимо клас, який буде в змозі через Google Talk посилати повідомлення IM. Створіть у пакеті otn. adf. googletalk клас MessageSender. Дайте Oracle JDeveloper вказівку додати основний (Main) метод.


package otn.adf.googletalk;


import org.jivesoftware.smack.ConnectionConfiguration;


import org.jivesoftware.smack.XMPPConnection;


import org.jivesoftware.smack.XMPPException;


import  org.jivesoftware.smack.packet.Message;


public class  MessageSender {


    private static String username =  “YOUR_GOOGLE_TALK_USERNAME”;


    private static String password =  “YOUR_GOOGLE_TALK_PASSWORD”;


    ConnectionConfiguration connConfig;


    XMPPConnection connection;


                      


    public MessageSender() throws  XMPPException {


        connConfig = new  ConnectionConfiguration(“talk.google.com”, 5222,  “gmail.com”);


        connection = new XMPPConnection(connConfig);


        connection.connect();


        connection.login(username, password);


    }


   


    public void sendMessage(String to, String  message ) {


        Message msg = new Message(to,  Message.Type.chat);


        msg.setBody(message);


       connection.sendPacket(msg);


    }


   


    public void disconnect() {


        connection.disconnect();


    }


   


    public static void main(String[] args)  throws XMPPException {


       MessageSender messageSender = new  MessageSender();


       messageSender.sendMessage(“youraccount@gmail.com”, 


             “Hello You. This is my first message sent programmatically using Smack API  and Google Talk.”);


       messageSender.disconnect();


   }


}


Переконайтеся, що в рядках 10 і 11 ви вставили ім’я та пароль для свого власного акаунту Google Talk. Також вставте свій акаунт (або акаунт вашого друга) в рядок 36, як пункт призначення (адресат) цього повідомлення: “Hello, world of instant messaging”.


Конструктор класу MessageSender створює підключення до сервера Google Talk і реєструється на ньому (рядки 17-21). Після створення екземпляра MessageSender викликається метод sendMessage з адресатом (кому надсилається повідомлення) і з самим текстом повідомлення. І, нарешті, підключення закривається за допомогою методу завершення.


Коли ви виконаєте програму, то швидко одержите своє перше повідомлення Google Talk, надіслане вашим власним додатком через сервер Google Talk:




 
 

Присутність

Однією з хороших можливостей миттєвого обміну повідомленнями є присутність (Presence), то є індикація того, хто з друзів і контактів доступні в даний момент. І Google, і API Smack підтримують присутність.

Спочатку ми можемо сказати всьому світу про наш власному присутності, виконуючи наведені нижче рядки програми:

/ / Сказати світові (чи хоча б нашим друзям), що ми доступні

Presence presence = new  Presence(Presence.Type.available);

presence.setMode(Presence.Mode.chat);

connection.sendPacket(presence);

Примітка: ми можемо вибирати з декількох режимів присутності: available (доступний), chat (в чаті), away (відійшов), xa (extended away – розширене відсутність) і dnd (do not disturb – прохання не турбувати).

Ще більш цікавий для нас той факт, що наша програма може дізнатися про присутність всіх наших контактів – в термінах IM, поіменний список (roster) – або про присутність певного контакту. Ось так визначається список всіх наших контактів:

Roster roster =  connection.getRoster();

Collection iter =  roster.getEntries();

for (RosterEntry entry : iter) {

     System.out.println(entry.getName()  + ” (” + entry.getUser() + “)”);

}

Отримання повідомлень

Якби ми могли б тільки посилати повідомлення, то наша розмова (тобто, сеанс зв’язку) був би дуже сумним. Наступний крок, який ми збираємося зробити, додає нашому “додатком” можливості прослуховування. Ми створимо клас MessageListener, який буде виглядати надзвичайно схожим на клас MessageSender. Фактично, для його створення досить спочатку зберегти файл MessageSender. Java як MessageListener . Java, а потім використовувати пошук і заміну, щоб замінити всі входження слова MessageSender на MessageListener.

Потім зробимо так, щоб клас реалізовував інтерфейс PacketListener, додаючи до специфікації класу implements PacketListener . Єдина вимога, що пред’являється нам цим інтерфейсом, це реалізація методу processPacket, як показано в цьому прикладі:

public void processPacket(Packet packet) {

    Message message = (Message)packet;

    System.out.println(“Message  (from: “+message.getFrom()+”): “+message.getBody());

}

Після того, як ми зареєстрували наш клас як Прослуховувач для повідомлень з підключенням, цей метод викликатимуть всякий раз, коли сервер Google Talk надсилає повідомлення нашу підключення. Реєстрація нашого класу як “прослуховувачі” для повідомлень з чату на наш акаунт робиться шляхом додавання цих рядків програми в кінці конструктора для MessageListener ():

/ / Прослуховувати надходять повідомлення для цього підключення

PacketFilter filter = new  MessageTypeFilter(Message.Type.chat);

connection.addPacketListener((PacketListener)this,  filter);

Примітка: Ми повинні додати до нашого класу наступні оператори імпорту, а проте, якщо ми додамо код, описаний вище, то Oracle JDeveloper, взагалі кажучи, зробить це за нас.

import org.jivesoftware.smack.filter.PacketFilter;

import org.jivesoftware.smack.filter.MessageTypeFilter;

import org.jivesoftware.smack.PacketListener;

import org.jivesoftware.smack.packet.Packet;

Тепер ми готові отримувати повідомлення. Якщо ми змінимо основний метод нашого класу MessageReceiver наступним чином, то отримаємо наше власне (надіслане нами ж) повідомлення:

public static void main(String[] args) throws XMPPException,

                                                     InterruptedException {

    MessageListener messageListener = new  MessageListener();

    messageListener.sendMessage(“youraccount@gmail.com”,

                    “Hello You. This is my second message sent programmatically using Smack API and Google Talk.”);

    // listen for 3 seconds

    Thread.sleep(3000);

    messageListener.disconnect();

}

Звичайно, замість того, щоб говорити з самим собою, було б набагато краще слухати повідомлення з чату, послані нашими друзями. Якщо жоден з них в даний час не доступний, Google Talk пропонує вам ряд “друзів”, з якими можна розмовляти. Ці так звані боти є програмованими акаунтами Google Talk, які пропонують переклад з однієї мови на іншу. Боти мають акаунти типу en2zh@bot.talk.google.com і nl2en@bot.talk.google.com, складені з двобуквений скорочень мови-джерела і вихідного мови. (Повідомлення про ботах перекладу Google Talk можна знайти, наприклад, на googletalk.blogspot.com/2007/12/merry-christmas-god-jul-and.html )

Ми можемо просто послати повідомлення з чату боту Google, і він пошле нам повертається повідомлення, що попросту кажучи, просто чудово для швидкого знаходження перекладу простих слів чи фраз. Ми можемо змінити основний метод ще раз і зробити так, щоб він вважав французькою мовою від 1 до 10 (хоча, звичайно, для того щоб зробити це, ви не потребуєте Боте перекладу):

MessageListener messageListener = new  MessageListener();

    String[] englishCounting = new String  [] {“one”, “two”, “three”, “four”,  “five”, “six”,  “seven”, “eight”, “nine”, “ten”};

    for (int  i=0;i< messageListener.disconnect(); } Thread.sleep(500); order right the in replies receiving of chances increase to pause slight add englishCounting[i]); messageListener.sendMessage(?en2fr@bot.talk.google.com?, { i++)>

Результат виконання програми на цей раз – рахунок на французькій мові:

Примітка: на своєму сервері боти Google Talk виконуються многопоточной (тобто, декількома потоками). Це означає, що якщо затримка між надісланими боту повідомленнями досить мала, відповіді можуть бути повернуті в іншому порядку, оскільки, наприклад, потік, що обробляє слово “п’ять”, може фактично відповісти швидше, ніж потік, що має справу зі словом “два”. Якщо ж перед посилкою наступного повідомлення ми будемо чекати 500 мс (або близько того), то у нас будуть непогані шанси отримати всі відповіді в належному порядку.

Частина 2: побудова Oracle ADF Faces Rich Client

Тепер, коли у нас є наше базове додаток Java, яке може і посилати повідомлення в чат, і приймати їх, прийшов час дізнаватися, як можна створити Web-додаток, який зможе робити ті ж самі речі. Ми будемо використовувати Oracle ADF Faces Rich для створення інтерфейсу користувача поверх рівня зв’язування даних Oracle ADF, щоб підключити Web-рівень до сервісів даних, які забезпечують доступ до контенту і операціями.

Ми додамо до MessageSender невелику додаткову функціональну можливість: властивість під назвою roster (іменний список) – список наших “приятелів по чату” – друзів, яких ми додали в Google Talk .

Спочатку створимо новий клас по імені TalkMate, bean-компонент з двома властивостями: toName і displayName.

package  otn.adf.googletalk;

public class  TalkMate {

     String toName;

     String displayName;

     public TalkMate() {

     }

     public void setToName(String toName) {

         this.toName = toName;

     }

     public String getToName() {

         return toName;

     }

     public void setDisplayName(String  displayName) {

         this.displayName = displayName;

     }

     public String getDisplayName() {

         return displayName;

     }

}

Додамо до класу MessageSender наступне приватне властивість:

private Collection<TalkMate> roster = new ArrayList();

і создадіме для цієї властивості методи засобів доступу (одержувач (getter) і посилає (setter)).

Потім додамо до методу конструктора MessageSender () такі рядки програми:

Roster friendsRoster = connection.getRoster();

Collection  rosterIter = friendsRoster.getEntries();

for (RosterEntry entry : rosterIter) {

   TalkMate friend = new TalkMate();

   friend.setDisplayName(entry.getName()!=null?entry.getName():entry.getUser());

   friend.setToName(  entry.getUser());

   this.roster.add(friend);

} rosterIter //

/ / Також, в перевірочних цілях, додайте до чату з самим собою

/ / Ваш власний акаунт

TalkMate veryBestFriend = new TalkMate();

veryBestFriend.setDisplayName(“Your  Own Display Name”);

veryBestFriend.setToName(  “YOUR_OWN_GOOGLE_TALK_ACCOUNTNAME”);

this.roster.add(veryBestFriend);

 

Тепер ми створимо bean-компонент MessageReceiver, який показує можливості прослуховування чату способом, дружнім до потенційних споживачів. Спочатку створимо наступний bean-компонент:

package  otn.adf.googletalk;

import  Java.util.Date;

public class  ChatMessage {

     private Date timestamp;

     private String from;

     private String body;

    

     public ChatMessage() {

     }

     public ChatMessage(String from, String  body) {

          this.timestamp = new Date();

          this.from = from;

          this.body = body;

     }

     public void setTimestamp(Date timestamp) {

         this.timestamp = timestamp;

     }

     public Date getTimestamp() {

         return timestamp;

     }

     public void setFrom(String from) {

         this.from = from;

     }

     public String getFrom() {

         return from;

     }

     public void setBody(String body) {

         this.body = body;

     }

     public String getBody() {

         return body;

     }

}

Потім – клас MessageReceiver, щось на зразок цього:

package otn.adf.googletalk;

import Java.util.ArrayList;

import Java.util.List;

public class  MessageReceiver {

    private List messages =  new ArrayList();

    public MessageReceiver() {

        try {

            MessageListener messageListener =  new MessageListener();

            messageListener.setReceiver(this);

        } catch (Exception e) {

        }

    }

    public void processMessage(String from,  String body) {

        ChatMessage message = new  ChatMessage(from, body);

        messages.add(0, message);

        for (ChatMessageListener  listener:messageListeners) {

            listener.processChatMessage(message);

        }

    }

    public void  setMessages(List messages) {

        this.messages = messages;

    }

    public List  getMessages() {

        return messages;

    }

}

Щоб змусити все це працювати разом, ми повинні внести в клас MessageListener невелика зміна. Додамо одержувача приватного (private) властивості до класу MessageListener, і створимо для нього отримувача і посилає:

MessageReceiver receiver;

Потім додайте в метод processPacket () наступний рядок:

if (this.receiver != null) {

      receiver.processMessage(message.getFrom(), message.getBody());

}

Це змусить MessageListener викликати processMessage з MessageReceiver, що, в свою чергу, додасть новий ChatMessage до колекції повідомлень в bean-компоненті MessageReceiver.

Щоб показати MessageSender і bean-компоненти MessageReceiver в палітрі керуючих елементів даних Oracle ADF (Oracle ADF Data Control Palette), ми повинні опублікувати обидва bean-компонента як елементи управління даними. Давайте спочатку зосередимося на MessageSender: Створіть і опублікуємо управління даними з меню, що викликається клацанням по правій кнопці миші, з вузла bean-компонента:



 

Після того як Oracle JDeveloper закінчить створення елемента керування даними, ми знайдемо MessageSender в палітрі елементів управління даними, доступної для використання будь-яким клієнтом Oracle ADF:



 
 

Прийміть мої поздоровлення, ви тільки що побудували “активне” додаток з товстим клієнтом!


 
 

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*