null

Научиться курить, или работаем с событиями календаря Liferay.

Как говорил великий писатель Марк Твен, "Нет ничего проще, чем бросить курить! Я делал это сотню раз!" . Писатель подчеркивал «лекгость» освобождения от этой, безусловно пагубной привычки, но ничего не говорил о том как можно к ней пристраститься заново. Я конечно не Марк Твен и успел начать курить всего три раза, но хотел бы поделиться этим, безусловно, знаковым опытом в своей жизни.

 

Причем здесь календарь, спросите вы? Одно из моих любимых занятий — это анализ предметной области и разработка информационных систем. К курению я, как обычно, применил системный подход. В Liferay portal cуществует такой портлет как Calendar, который позволяет осуществлять планирование событий (CalEvent), формировать обертку этих событий, в виде пригодном для их дальнейшей публикации на портале (AssetEntry), их категоризацию (Categories) и пометку тегами (Tags). Эти возможности позволят точно контролировать процесс втягивания в пагубную привычку.

 

Итак, как же начинают курить? Первый опыт у меня был во втором классе и его нельзя считать полноценной попыткой. Мы с моим другом собирали бычки рядом со школой и все, что я запомнил, это отвратительный вкус окурка и публичное порицание перед лицом всего класса, по ябеде одной зануды-отличницы. Далее была старшая школа и желание не упасть в глазах своих сверстников. Так, наверное, происходило у всех курильщиков. После 6 лет активного попыхивания дымной палочкой я бросил и не курил лет 5.

 

Что же может двигать относительно взрослым молодым человеком в его дальнейшем интересе к курению? Во первых, это воспоминания эйфории от первой сигареты. Во вторых, предположение — от одной сигареты не втянешься, поэтому если я на этой вечеринке выкурю одну штучку, то вреда особого не будет.

 

Итак, вчеринка. Или праздник. Или «побухать с Андрюхой». Все это можно запланировать в календаре. Для каждого такого события создается объект com.liferay.portlet.calendar.model.impl.CalEventImpl, который доступен для программиста при помощи интерфейса com.liferay.portlet.calendar.model.CalEvent. Экземпляру класса соответствует запись в таблице CALEVENT:

 

CREATE TABLE CALEVENT (
UUID_ VARCHAR(75),
EVENTID BIGINT NOT NULL,
GROUPID BIGINT,
COMPANYID BIGINT,
USERID BIGINT,
USERNAME VARCHAR(75),
CREATEDATE TIMESTAMP,
MODIFIEDDATE TIMESTAMP,
TITLE VARCHAR(75),
DESCRIPTION LONGVARCHAR,
STARTDATE TIMESTAMP,
ENDDATE TIMESTAMP,
DURATIONHOUR INTEGER,
DURATIONMINUTE INTEGER,
ALLDAY BOOLEAN,
TIMEZONESENSITIVE BOOLEAN,
TYPE_ VARCHAR(75),
REPEATING BOOLEAN,
RECURRENCE LONGVARCHAR,
REMINDBY INTEGER,
FIRSTREMINDER INTEGER,
SECONDREMINDER INTEGER
);

 

Имена методов доступа у модели соответствуют столбцам таблицы с применением общих правил формирования имен в Java. Например, столбец COMPANYID отражается в аттрибут companyId и соответсвующие методы public long getCompanyId() и public void setCompanyId(long id).

 

Ну что же, пойдем сегодня для начала на вечеринку. Разработчики Liferay рекомендуют для этого использовать статический метод класса:

com.liferay.portlet.calendar.service.CalEventLocalServiceUtil.addEvent(
    long userId, java.lang.String title, java.lang.String description,
    int startDateMonth, int startDateDay, int startDateYear,
    int startDateHour, int startDateMinute, int endDateMonth,
    int endDateDay, int endDateYear, int durationHour, int durationMinute,
    boolean allDay, boolean timeZoneSensitive, java.lang.String type,
    boolean repeating,
    com.liferay.portal.kernel.cal.TZSRecurrence recurrence, int remindBy,
    int firstReminder, int secondReminder,
    com.liferay.portal.service.ServiceContext serviceContext)
    throws com.liferay.portal.kernel.exception.PortalException,
   com.liferay.portal.kernel.exception.SystemException;

 

Страшно? Вы не видели еще легких курильщика, какими их видит хирург на операции! Я, надо сказать, сам три беломорины высмолил перед тем, как его первый раз использовать. Но, по ходу развития событий привычки у нас еще нет, мы можем запланировать наше наслаждение от табака в обществе друзей, терпеливо набирая параметры и вставляя 0 и null вместо неиспользованных значений.

CalEvent e = CalEventLocalServiceUtil.addEvent(
   themeDisplay.getUserId(), "smoke first time","party smoke",
   Calendar.JULY,29,2011,18,30,
   Calendar.JULY,29,2011,23,59,
   false,true,"smoking",false,
   null,0,0,0,
   ServiceContextFactory.getInstance(request));

Проблемы у начинающего курильщика могут возникнуть на получении ServiceContext. В данном примере контекст создается на основании HTTPServletRequest (переменная request доступна в контексте JSP), что занимает достаточно много ресурсов. В вызове addEvent есть много плюсов — он сам создаст первичный ключ, зарегистрирует Asset, занесет значение в базу из кеша, и пр. Для того, что бы увидеть полный список необходимых действий, рекомендую посмотреть в код CalEventLocalServiceImpl.addCalEvent(....). Вот его содержательная часть:

 

try{
   CalEvent ce =
           CalEventLocalServiceUtil.createCalEvent(CounterLocalServiceUtil.increment());
   ce.setTitle(....); // Здесь необходимо обязательно установить все служебные поля
   ce.set....; // (uuid, userId, companyId, grouiId, и пр.)
   CalEventLocalServiceUtil.addCalEvent(calEvent);
} catch (SystemException e) {
   e.printStackTrace();
   } finally {
   // MultiVMPoolUtil.getMultiVMPool().clear();
   CalEventLocalUtil.clearEventsPool(cе.getGroupId());
}

И вот мы сидим, попыхивая ароматной сигарой, наслаждаясь янтарным коньяком и обществом близких людей. На следующий день вы и не вспомните о том, что вы курили. Однако через неделю вы подумаете что можно повторить, ведь с друзьями так хорошо! И так медленно и незаметно вы погружаетесь в другую реальность. Каждую пятницу, после работы, грех не выпить кружечку пива, и не выкурить сигарилку. Или две.

В Liferay для этого существует повторяемость событий. TZSRecurrence создается совместно с установкой setRepeating(true)так:

Calendar recStartCal = CalendarFactoryUtil.getCalendar(timeZone);
recStartCal.setTime(ev.getStartDate());
TZSRecurrence recurrence = new TZSRecurrence(
recStartCal, new Duration(0, 0, 5, 29), Recurrence.WEEKLY);
recurrence.setTimeZone(timeZone);
recurrence.setByDay(new DayAndPosition[] {new DayAndPosition(Calendar.FRIDAY,0)});
ev.setRecurrenceObj(recurrence);
ev.setRepeating(true);
CalEventLocalServiceUtil.updateCalEvent(ev);

 

Жизнь хороша! Но постепенно тяга к удовольствиям берет свое. Зачем ждать до пятницы? Не зря же на востоке люди окутывают себя дымом кальяна каждый вечер, становясь похожими на Синюю Гусеницу из Алисы в зазеркалье. Меня, конечно, всегда смущали вещества, которые забивают в кальян, но восток дело тонкое, не будем развивать эту возможность. Итак, теперь мы радуемся празднику каждый вечер от Calendar.MONDAY до Calendar.SUNDAY.

 

Тут внутри начинает зреть беспокойство. Liferay всегда позволит вам запланировать конечную дату таких ежедневных встреч, и вы будете думать что через месяц то вы уж точно не будете синячить и дымить каждый день:

recStartCal.add(Calendar.MONTH,1);
recurrence.setUntil(recStartCal);

 

Но всей птичке пропасть, коль увяз коготок … После одного бизнес ланча, пригревшись на солнышке вы думаете о том, что как было бы хорошо затянуться ароматной сигарой, в целях улучшения исключительно пищеварения! Все с этого момента вы курильщик. Вы покурите днем, вечером, а потом опять днем, вечером, и в одно утро после очередного праздника в Бутове или Коломягах, выйдете на балкон и будете курить по три папироски в день.

 

После этого качество и вкус табака навсегда теряются, появляется ежечасное беспокойство, ваша девушка начинает кривить алые губки при поцелуях, а коллеги по работе по очереди подходить к вам и предлагать запереться в душном и маленьком помещении что бы жадно и нервно вдыхать окружающую атмосферу чуть разбавленную вашим собственным табачным дымом. Да и еще. Обоняние притупляется и вы действительно не чувствуете как отвратительно воняют у вас волосы и руки. Появляется кашель.

 

На этом месте я хочу дать совет:

 

CalEventLocalServiceUtil.deleteEvent(ev);

 

Воспользуйтесь им если сможете. Вспомните Марка Твена!

 

PS. А если серьезно, я считал и продолжаю считать, что физической тяги к курению не существует. Попробуйте когда вас позовут курить остаться на месте и сосредоточится на программировании. А когда захочется курить (как вы думаете) перевести внимание опять на программирование. Может зарплату начальство повысит?

Вперед