Saturday, November 24, 2007

SOA в корпоративной информационной системе

Написал черновик статьи, в которой попытался собрать различные высокоуровневые методологии/технологии (SOA, бизнес-процессы, автоматизация, OLTP, OLAP и т.д.) в единую информационную систему.
Получилось довольно размыто, обзорно и, естественно, туда поместилось не все, что хотелось. Но для закрепления определенного этапа - я думаю достаточно.

SOA в корпоративной информационной системе (161 КБ)

Обновление 25.04.2008

Статья опубликована: Вестник филиала Всероссийского заочного финансово-экономического института в г. Владимире. Выпуск 2. - Владимир, 2007. - 218 с. ISBN 5-89368-767-1 стр. 109-113

Обращение к private-элементам в Java (Java Reflection)

Недавно у нас с Ивом состоялся разговор о private-элементах Java (приватные классы, поля и т.д.)
Он был уверен, что если класс объявлен как приватный - его экземпляр нельзя создать где-либо еще, кроме как из класса, в котором он был объявлен. То же самое с приватными полями - если поле описано с модификатором доступа private, то к нему нельзя получить доступ если нет соответствующих getter/setter-методов.

На самом деле, механизм Java Reflection позволяет сделать с кодом все, что угодно и получить доступ к любой информации о коде и к состоянию объектов.

PublicClass.java

01
02 public class PublicClass {
03
04
/**
05
* Значение этой переменной нельзя непосредственно установить из Java-кода
06 * оператором присваивания, но, как будет видно дальше, это значение можно
07 * изменить при помощи механизма рефлексии.
08 */
09 private int a = 0;
10
11 public int getA() {
12 return a;
13 }
14
15 /**
16 * Это приватный класс. Дальше в примерах мы создадим экземпляр этого класса
17 * и вызовем на нем метод <code>toString()</code>.
18 *
19 * Этот класс может существовать только в контексте экземпляра
20 * {@link PublicClass}; мы увидим, как можно установить контекст для нового
21 * экземпляра {@link PrivateInnerClass}.
22 *
23 * @author dmitrygusev
24 *
25 */
26 @SuppressWarnings("unused")
27 private class PrivateInnerClass {
28 @Override
29 public String toString() {
30 return "Hello from PrivateInnerClass instance!";
31 }
32 }
33
34 }


TestAccessPrivateMembers.java

01 import static org.junit.Assert.assertEquals;
02
03 import java.lang.reflect.Constructor;
04 import java.lang.reflect.Field;
05 import java.lang.reflect.Member;
06
07 import org.junit.Test;
08
09 public class TestAccessPrivateMembers {
10
11 /**
12 * Получим список объявленных конструкторов. Методы
13 * <code>java.lang.Class.getDeclaredXXX()</code>, например,
14 * {@link Class#getDeclaredConstructors()}, возвращают список всех
15 * объявленных элементов ({@link Member}), а не только
16 * <code>public</code>.
17 *
18 * Если нужно получить только <code>public</code> элементы, то можно
19 * воспользоваться методами <code>java.lang.Class.getYYY()</code>
20 * (например, {@link Class#getConstructors()}).
21 *
22 * @see java.lang.reflect.Member
23 * @see java.lang.Class
24 * @see java.lang.reflect.Field
25 * @see java.lang.reflect.Method
26 * @see java.lang.reflect.Constructor
27 */
28 @Test public void accessPrivateMembers() throws Exception {
29 /*
30 * В данном случае у нас лишь один inner-класс - PrivateInnerClass
31 */
32 Class<?> clazz = PublicClass.class.getDeclaredClasses()[0];
33
34 /*
35 * Получим его конктруктор по умолчанию
36 */
37 Constructor<?> constr = clazz.getDeclaredConstructors()[0];
38
39 /*
40 * Установим признак доступности этого конструктора, чтобы его можно
41 * было вызвать
42 */
43 constr.setAccessible(true);
44
45 /*
46 * Создадим класс-контекст для внутреннего класса
47 */
48 PublicClass pc = new PublicClass();
49
50 /*
51 * Создадим экземпляр внутреннего класса, передав класс-контекст в
52 * качестве параметра конструктору
53 */
54 Object o = constr.newInstance(pc);
55
56 /*
57 * Вызовем метод toString() на внутреннем классе
58 */
59 assertEquals("Hello from PrivateInnerClass instance!", o.toString());
60
61 /*
62 * Прочитаем значение private-переменной через соответствующий
63 * getter-метод
64 */
65 assertEquals(0, pc.getA());
66
67 /*
68 * Изменим значение этой private-переменной. Для этого нужно получить
69 * соответствующий объект java.lang.reflect.Field, у которого есть метод
70 * Field.set(object, value).
71 */
72 Field fieldA = pc.getClass().getDeclaredField("a");
73
74 fieldA.setAccessible(true);
75
76 fieldA.set(pc, 2);
77
78 /*
79 * Прочитаем значение private-поля - оно должно быть равно 2
80 */
81 assertEquals(2, pc.getA());
82 }
83
84 }

Tuesday, November 06, 2007

Сувениры Java

Заметил, что у меня накопилось уже много сувениров так или иначе связанные с тематикой Java. Буду выкладывать их в этот пост, интересно посмотреть... :)

Постер JavaPolis 2007


Прислали сегодня приглашение на JavaPolis 2007, в конверте был постер конференции. Пока что это эксклюзив, его видели меньше 3000 человек в мире :) Точнее те из них, кто также запросил подтверждение о регистрации на конференции :)

Резиновый Duke

На Sun Tech Days 2006 в Москве и Sun Tech Days 2007 в Питере ведущий (не помню, как его зовут... Джефри?), который объявлял спикеров, да и все спикеры, включая Джеймса Гослинга, во время выступлений кидали в зал резиновых Duke'ов, футболки с логотипами Duke/Sun/Java и прочие сувениры.
Этот Duke с STD2007, его поймала моя Настя :) Стоит сейчас у нас дома на компьютерном столе.

Monday, November 05, 2007

Семинар Keyintegrity "Основы Java"

В середине октября 2007 я с моими коллегами Павлом Чурсиным и Алексеем Солодовниковым провели многодневный обучающий семинар по теме "Основы Java" в ТатАСУНефть.

Семинары состояли из двух дней лекций, и одного дня лабораторных работ.

Некоторые вопросы, рассмотренные в рамках лекций:

  1. Введение в Java
    1. Историческая справка
    2. Платформы Java ME/SE/EE
    3. Версии платформы Java
    4. JRE/JDK и JVM
  2. HelloWorld
    1. Точка входа в приложение, аргументы командной строки, код возврата
    2. Из чего состоят, как компилируются и запускаются приложения Java
  3. Поддержка ООП в Java
    1. Классы в Java
      1. Атрибуты класса
        • Имя
        • Модификаторы класса
        • Поля
        • Методы
        • Конструктор
        • Инициализатор
      2. Вложенные, Анонимные и Абстрактные классы
    2. Наследование и полиморфизм
    3. Интерфейсы
    4. Статический контекст
  4. Пакеты
  5. JavaBean и POJO
  6. Синтаксические конструкции языка
    1. Основные конструкции
    2. Потоки выполнения
      1. Исключительные ситуации
      2. Иерархия исключительных ситуаций
    3. Аннотации
    4. Generics
  7. Collections API (java.util.*)
    1. Collections, List, Set, Queue
    2. Vector, Stack
    3. Map
  8. Многопоточность
    1. Thread/Runnable
    2. Concurrency API (java.util.concurrency.*)
  9. I/O Streaming API (java.io.*)
    1. Serializable
    2. Input/OutputStream и иерархия
  10. И др.
На третий день были запланированы две лабораторные работы:
  • потоковый ввод/вывод и Collections API
  • многопоточное приложение и ООП
Мы также подготовили методические указания для выполнения работ в Eclipse IDE (1,3 МБ). Там же можно найти текст заданий к лабораторным работам.

Лабораторная работа №1

Цель работы:

Ознакомиться со средой разработки Eclipse JDT. Закрепить навыки создания и отладки простых консольных приложений на Java. В этой работе используются:

  • стандартные пакеты для работы с потоковым вводом/выводом,
  • сериализация объектов,
  • разбор параметров командной строки,
  • Java Collections API,
  • определение простых классов (JavaBeans),
  • сортировка списка объектов из этих классов по заданным критериям.

Лабораторная работа №2

Цель работы:

В этой предполагается создание утилиты для работы с файловой системой. Основными особенностями являются:

  • Использование возможностей ООП в Java: работа с интерфейсами и абстрактными классами, перегрузка методов;
  • Использование рекурсии для работы с файловой системой;
  • Создание многопоточного приложения с разделением общих объектов и синхронизацией потоков.

Исследовать возможности многопоточного программирования и применения интерфейсов, абстрактных классов и наследования в Java.


Решения для лабораторных работ можно скачать здесь (15 КБ).

Отдельно хочется отметить BlueJ - отличная вещь для преподавания ООП и Java.

Семинар Keyintegrity "Сближая бизнес и IT: методология и инструментарий BPM для эффективного управления бизнес-процессами предприятия"

Второго октября 2007 компания Keyintegrity провела бесплатный семинар в г. Набережные челны по теме "Сближая бизнес и IT: методология и инструментарий BPM для эффективного управления бизнес-процессами предприятия".

Я читал доклад о взаимосвязи SOA, BPMN и BPEL (презентация прилагается, 173 КБ).

Хотя про перечисленные выше технологии сегодня говорят очень много, у руководителей IT-подразделений все еще не до конца сложилось представление о них. В ходе семинара мы на конкретных примерах продемонстрировали место этих и сопутствующих технологий в организации.

На демонстрации разбирался пример, опубликованный в одном из предыдущих постов, реализованный на Intalio|BPMS.

Особенно хочется отметить роль Open Source'овых продуктов. Известно, что внедрение SOA рекомендуется начинать постепенно, с "маленьких" бизнес-процессов, потихоньку на практике знакомясь с особенностями применения данной методологии. Закупать для этих целей полнофункциональные продукты уровня Enterprise, такие как, например, семейство продуктов WebSphere (ESB, Process Server, и т.д.) - слишком дорогое удовольствие, а применение бесплатных Open Source аналогов может быть вполне оправданным.

Функциональных возможностей Open Source аналогов может быть вполне достаточно и для их дальнейшего использования в production, а если возникнет необходимость в переносе уже реализованного функционала на коммерческие продукты, то этот процесс не займет больших усилий:

  1. С одной стороны благодаря поддержке открытых стандартов - для переноса возможно нужно будет поменять только схемы деплоймента (BPEL, WS, Java EE и т.д.);
  2. С другой стороны это связано с одной из моделей коммерческого Open Source. Производители коммерческого ПО выносят базовую функциональность своих продуктов в Open Source, оставляя в коммерческой версии функции, необходимые для применения в production. В этом случае все проекты смогут работать в коммерческой версии "как есть".

Saturday, November 03, 2007

Java-, WS- и XML-технологии в проекте WebSeller

Проект WebSeller, который я делал в магистратуре в рамках курсовой работы/проекта в 2005 году.

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

Аннотация
Цель данного учебного проекта – получить навыки разработки распределенных программных систем на платформе J2EE. В качестве основной архитектуры рассматривается сервис-ориентированная архитектура (Service-Oriented Archi-tecture, SOA) на основе web-служб. Рассмотрены основные технологии разра-ботки web-служб, в частности – JAX-RPC и язык описания бизнес процессов на основе web-служб – BPEL, а также разработаны две web-службы с использова-нием рассмотренных технологий.
В проекте используются, в основном, продукты Apache Software Foundation и другие open source проекты. Дается краткое описание использованных техноло-гий и приемы работы с ними.
Так же уделяется внимание унифицированному процессу RUP, как подходу к проектированию подобных учебных проектов.
В приложениях на компакт диске представлены исходные коды в виде проекта для IDE Eclipse 3.1; набор разработанных артефактов RUP для проекта, а также дистрибутивы использованных программных технологий.

Табл.: 2; Ил.: 15.

Скачать проект (2 МБ):
  • Пояснительная записка
  • Плакаты
  • Артефакты RUP
  • Проект WebSeller для Eclipse 3.1.1