Статьи

Реализация приложения Tag-Cloud на Google App Engine с помощью JDO + Security + Groovy Server Pages

В этой статье описываются этапы создания веб-приложения для платформы Google App Engine, использующего инфраструктуру постоянства и безопасности Google. Приложение для демонстрации представляет собой базовую реализацию облака тегов — http://mytagclouds.appspot.com/ .

Задача

Цель данной статьи — не углубляться во все аспекты приложения и не оценивать все параметры, доступные на каждом этапе — JDO или JPA (для сохранения в GAE), аутентификацию по учетным записям Google или OpenId — с доступом к приложению через подпрограмму. -домены или нет, Groovy Server Pages или Grails или Gayelk, jQuery или GWT, POJO или POGO и т. д. 

Цель состоит в том, чтобы взять одно сечение доступных альтернатив (JDO, аутентификация по учетным записям Google, Groovy Server Pages, jQuery, POJO) и выяснить, что нужно для создания потенциально полезного приложения, которое подкреплено безопасностью Google. , постоянная инфраструктура и различные другие серверные системы!

Для получения дополнительной информации по различным аспектам я постараюсь указать на ресурсы с соответствующей информацией.

Демо-приложение

Демо-приложение ( http://mytagclouds.appspot.com/ ) является простым — оно позволяет вам сохранять интересующие вас элементы по категориям и помечать их некоторыми ключевыми словами. Приложение сохраняет ваши элементы и представляет классифицированное представление ваших элементов в облаке тегов.

Приложение построено с использованием в основном следующих технологий:

  •  Пользовательский интерфейс строится с использованием Groovy Server Pages
  • Проверка подлинности на уровне приложения с использованием существующих учетных записей Google.
  • Постоянство на уровне приложения с использованием инфраструктуры JDO.
  • Реализация облака тегов и функции Ajax выполняются с использованием библиотеки jQuery.

Вот общая функциональность приложения:

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

 Среда разработки

 Google App Engine SDK поставляется с плагином для Eclipse, который можно скачать здесь

Этот плагин имеет веб-сервер, который эмулирует службы App Engine на вашем локальном компьютере, и содержит необходимые библиотеки, упакованные с ним. Например, если вы решили защитить свое приложение, веб-сервер создаст стандартную страницу входа, и если вы решили использовать JDO для сохранения в App Engine, для этого не нужно устанавливать ничего другого — плагин поставляется со встроенным хранилищем сохраняемости — просто отправляйте запросы JDO DB!

Помимо эмуляции сервисов App Engine, плагин предоставляет еще две вещи:

  •  Поддержка GWT (Google Web Toolkit)
  • Развертывание из локальной среды затмения на серверы Google App Engine выполняется одним щелчком мыши.

 

Безопасность приложений

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

Для демонстрационного приложения я выбрал аутентификацию по API аккаунтов Google. Единственная конфигурация, необходимая для этого, — это определение ограничения безопасности (<security-constraint>) в вашем файле web.xml. (Обратите внимание, что вы не можете определить какие-либо настраиваемые роли безопасности (<security-role>) или альтернативные механизмы аутентификации (<login-config>)).

Для демонстрационного приложения вот соответствующая конфигурация:

<security-constraint>
<web-resource-collection>
<web-resource-name>All Access</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>

Вот и все. Как только приложение развернуто с этой конфигурацией безопасности, когда к нему обращаются, ядро ​​приложения предоставляет пользователю стандартную страницу входа, как показано ниже.

 

Как показано выше на странице входа в Google, механизм приложения отвечает за то, чтобы приложение получало только почтовый идентификатор аутентифицированного пользователя (используя request.getUserPrincipal (). GetName () ) для персонализации состояния приложения и следит за тем, чтобы приложение Приложение не имеет никакого доступа к учетным данным пользователя.

Упорство

Механизм приложения поддерживает 2 способа сохранения данных в настоящее время — объекты данных Java (JDO) и API сохранения Java (JPA). Данные хранятся в хранилище объектов без схемы, а не в реляционной базе данных. Подробную информацию о сохраняемости в движке приложения можно найти здесь .

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

Сохранение единой сущности

Маркировка сущностей с помощью специальных аннотаций JDO

@PersistenceCapable
public class Item {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;

@Persistent
private String userId;
...
...
...
}

Запрос данных с использованием языка запросов JDO JDOQL:

PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("transactions-optional");

PersistenceManager pm = pmf.getPersistenceManager();

String query = "select from " + Item.class.getName() + " where userId == '" +
userId + "' && category == '" + categoryName + "'";

items = (List<Item>) pm.newQuery(query).execute();

Постоянные сущности с отношениями 1-ко-многим

Приведенный ниже код подчеркивает конфигурацию JDO, необходимую для обработки отношения «один ко многим» между элементом и тегами:

@PersistenceCapable
public class Item {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;

@Persistent
private String userId;

...
...
/* this is the property that is used as foreign key */
@Persistent(mappedBy = "item")
private List<Tag> tags; /* collection to hold an item’s many tags */
...
...
}

@PersistenceCapable
public class Tag {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key id;

...
...
private Item item; /* should be the same key as used in mappedBy above */
...
...
}

Конфигурация уровня приложения

В дополнение к web.xml веб-приложения, специфическая конфигурация движка приложения должна быть сделана в файле конфигурации с именем appengine-web.xml. Вот некоторые вещи, которые мне нужно было настроить:

  • <application> — это должен быть зарегистрированный идентификатор приложения вашего приложения в ядре приложения. Идентификатор приложения «mytagclouds» будет доступен как http://mytagclouds.appspot.com
  • <версия> — при желании вы можете одновременно запустить несколько версий вашего приложения. Например, к определенной версии можно получить доступ как http://3.latest.mytagclouds.appspot.com/, но http://mytagclouds.appspot.com будет указывать на последнюю развернутую версию.
  •  <static-files> — движок приложения физически разделяет статический и динамический контент приложения для достижения лучшей производительности. Статический контент разворачивается на выделенных веб-серверах и легче распределяется / реплицируется.
  • <includes> / <exclude> — эти элементы могут использоваться для точного определения того, какой контент вы хотите, чтобы механизм приложений воспринимал как статический контент. Например, для этого демонстрационного приложения, если Groovy Server Pages (* .gsp) не исключены из <static-files>, ядро ​​приложения будет обслуживать код файла при обращении к нему и вместо того, чтобы Groovy Engine обрабатывал эти * .gsp файлы. и вместо этого обслуживать сгенерированный контент.
  • <session-enabled> — если вы хотите сохранить данные в сеансе, вам нужно сначала явно включить их, чтобы избежать исключений времени выполнения от серверов ядра приложений.

Более подробную информацию о appengine-web.xml можно найти здесь .

Развертывание в Google App Engine

Как только ваше приложение разработано и протестировано локально с помощью SDK ядра приложения и его эмулированных сервисов ядра приложения, можно легко развернуть приложение на ядре приложения с помощью eclipse-plugin.

Или, если вы предпочитаете делать это из командной строки (скажем, после выполнения определенных шагов сборки приложения — например, компиляции ваших скриптов groovy), развертывание из командной строки так же просто, как следующая команда из каталога приложения:

appcfg update war

Вас могут попросить ввести учетные данные вашей учетной записи Google для загрузки приложения в среде вашего движка приложений Google.

Вот и все. Ваше приложение теперь готово к использованию из механизма приложений.

Мониторинг и устранение неисправностей вашего приложения

Движок приложения предоставляет исчерпывающую панель инструментов, которая позволяет отслеживать работу вашего приложения в облаке. Консолидированные журналы доступны, чтобы помочь вам устранить любые проблемы, которые могут возникнуть.

 

Это все, чем я мог поделиться в этой статье. Спасибо за чтение. Пожалуйста, поделитесь своими отзывами / комментариями — в этом пространстве можно многому научиться, и это только начало.

Если кто-то заинтересован в коде для этого демонстрационного примера, пришлите мне строку по адресу roshandawrani@codehaus.org, и я буду рад поделиться ею.