Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Описание платформы Apache Cayenne

Содержание

 

 

Введение……………………………………………………….…….....3

1 Краткие сведения о месте прохождения практики………………..4

1.1 Характеристика организации………………………………….4

1.2 Целевые ориентиры организации……………………………..4

2 Описание платформы APACHE CAYENNE………………….……5

3 Анализ предметной области………………………………………. 7

4 Разработка ПО……………………………………………………….8

Заключение……………………………………………………...……..9


Список использованной литературы………………………………..10

Приложение 1…………………………………………………..….….11

ВВЕДЕНИЕ

 

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

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

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

 

 

Краткие сведения о месте прохождения практики

Характеристика организации

· Офисы: Коннектикут, США и Минск, Беларусь.

· Персонал: 14 человек полный рабочий день. Java-эксперты и QA специалисты.

· Обширная сеть местных партнеров в C, C + +,. NET и мобильных экспертов.

· Клиентская география: США, Канада, Германия, Австралия.

· Проекты: высоко-производительные веб-порталы, системы образования, собственные системы управления контентом, реляционные базы данных.

 

История

· 2002: Основана в США Андрусём Адамчиком.

· 2006: Старт разработки проекта с открытым исходным кодом Apache Cayenne.

· 2008: Переезд всего штата разработчиков в Беларусь.

· 2009: ИПУП «ОбъектСтиль» стал резидентом белорусского Парка высоких технологий.

 

Целевые ориентиры организации

ИПУП «ОбъектСтиль» является разработчиком программного обеспечения и аутсорсинга, состоит из команды профессиональных программистов, специалистов по тестированию ПО и менеджеров сосредоточенных на собственных решений. Послужной список включает проекты в области управления веб-контента и предприятий, системы мониторинга для облачных технологий, системы образования учащихся, и многое другое. Это не большая компания, но клиентская география охватывает Северную Америку, Европу и Австралию. Одним из самых заметных проектов является продолжающееся партнерство с Национальной хоккейной лигой. «ОбъектСтиль» сторонник ПО с открытым исходным кодом и участник разработки вышеупомянутого. «ОбъектСтиль» основал одну из лидирующих на рынке свободно распространяемого ПО, технологию объектно-реляционного проецирования (ORM) -Apache Cayenne, которая в настоящее время осуществляел поддержку в Apache Software Foundation.

 

 

Описание платформы APACHE CAYENNE

Apache cayenne является общедоступным проектом под лицензией Apache, обеспечивающим объектно-реляционной отображение (ORM) и удаленное взаимодействие сервисов. Другими словами, это инструмент для разработчиков Java, которым необходимо обращаться к базе данных (или нескольким базам данных). Сayenne имеет множество уникальных и мощных возможностей, может решать широкий круг потребностей разработчиков. Он легко связывает одну или несколько схем баз данных непосредственно через Java объекты, управляет автоматическими фиксациями и откатами, генерирует SQL, объединения, последовательности, и многое другое. С дистанционным объектами Cayenne, эти Java-объекты могут быть сохранены даже к клиентам через веб-службы.

Cayenne был разработан, чтобы быть наиболее простым в использовании и при этом без ущерба для функциональности и дизайна. Для этого, Cayenne поддерживает базу данных с обратным построением и генерацией, а также класс-двигатель для быстрой генерации. Все эти функции могут управляться непосредственно через Cayenne Modeler − полнофункциональный инструмент с графическим интерфейсом. Никаких загадочных XML настроек или аннотации для конфигурации не требуется. Всю схему базы данных можно напрямую сопоставить Java-объектам в течение нескольких минут, всё, не выходя из графического интерфейса Cayenne Modeler, что позволяет облегчить жизнь Java-разработчикам.

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

Cayenne распространяется с CayenneModeler − полное отображение GUI инструментов, которые поддерживают реверс-инжиниринг схем СУБД, работу с базой данных и генерации исходного Java-кода для постоянных объектов.

 

 

Постоянные Java -классы генерируются и синхронизируются с использованием Modeler или же с Maven или Ant. Схемы базы данных SQL могут быть получены из Modeler, а также с простых вызовов API.

Вместо жесткого кодирования операторов SQL через Java-код, Cayenne позволяет программисту работать только с объектами Java и абстрагироваться от базы данных. Вот лишь некоторые из преимуществ подхода Cayenne:

· переносимость между практически любой базой данных, содержащей драйвер JDBC не меняя ни одной строки кода в вашем приложении;

· никакое знание SQL не требуется (в то время как он все еще может быть полезно);

· кэширование для того, чтобы ваше приложение работало быстро и можно было избежать повторных просмотров базы данных для тех же данных;

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

· разбивка, что снижает пропускную способность, также запросы только один раз загружают содержимое объектов, когда они действительно необходимы;

· настраиваемые блокировки для обеспечения целостности данных и предотвращения неожиданных потерь данных, когда еще одним инструментом изменилась база данных;

· графический интерфейс базы данных / схемы Modeler для упрощения обучения Cayenne. Modeler сохраняет XML-файлы, которые можно вручную редактировать, если это необходимо.

Также здесь есть несколько вещей, которые ставят Cayenne отдельно от других продуктов ORM:

· возможно также работать в ROP- режиме, когда несколько клиентов подключиться к источнику данных не через JDBC, а через удаленный Cayenne регулируемым сервисом. Это дает гораздо больший контроль при централизованной проверке, кэшировании и сохранении объектов с сервера до клиента;

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

 

Анализ предметной области

 

Проходя производственную практику в “Object Style”, основным предметом деятельности являлся непосредственно “CayenneModeler”. Главная задача была направлена на улучшение CayenneModeler Swing GUI tool. Все задачи необходимо было сделать в соответствии с архитектурой всего проекта, написанный код должен быть структурирован и понятен. Эти требования являются самыми важными.

Работая с “CayenneModeler”, при создании проекта необходимо создать “DataNode” и “DataMap”. “DataNode” − это дискриптор единой базы данных, к которой подключается ваше используемое приложение. В проекте может существовать более одного “DataNode”, при создании в нём указываются JDBC параметры соединения и другие необходимые настройки. “DataMap” − это объект, который хранит в себе всю информацию об отображении данных. В “DataMap” редакторе имеется возможность определения к какому “DataNode” он относится (все “DataMap” должны иметь свой единственный “DataNode”), а также имеются другие необходимые настройки.

Необходимо дополнить данное приложение новой функциональностью, а именно:

1. Создать возможность одновременной генерации классов из CAYNNE-проекта в JAVA-проект для выбранных сущностей всех единиц CAYNNE-проекта, так называемых карт хранения данных(DataMaps). Текущая версия CayenneModeler позволяет генерировать классы для всех сущностей лишь для одной карты данных.

2. Создать возможность одновременной генерации схемы базы данных для выбранных таблиц, запросов, процедур всех единиц CAYNNE-проекта (DataMaps) с непосредственной выгрузкой в СУБД(в нашем случае MySQL). Текущая версия CayenneModeler позволяет генерировать схему базы данных лишь для одной карты данных.

3. Усовершенствовать визуальное отображение связей между DataMap и DataNode с помощью дополнительных компонентов на графическом интерфейсе пользователя, а так же добавить альтернативную возможность манипуляции картами данных в виде Drag and Drop. Данная задача включает создание функционала для синхронной работы всех компонентов и процессов касающихся связи DataMaps и DataNode.

 

Разработка ПО

Для разработки программного обеспечения была использована платформа Eclipse Indigo, а так же технологии Apache Maven (для сборки исходного кода в jar файл написанного под управлением данной технологии) и SVN Eclipse Subversion (для скачивания исходного кода из репозитория и создания патчей с изменениями исходного кода). В качестве операционной системы использовалась Ubuntu 12.04.

Решение первой задачи (возможность одновременной генерации классов) можно условно разбить на три более мелких подзадачи, так как генерация классов состоит из трёх параллельных модулей: генерация в стандартном режиме (Standard Persistent Objects), генерация в режиме клиента (Client Persistent Objects), и «продвинутый» режим (Advanced).

При написании программ, производился детальный анализ имеющегося в проекте кода и на основе его строились новые поля, методы и классы. Новый написанный код дополнялся соответствующими комментариями, так как данный код будет использоваться в дальнейшем другими разработчиками. Написанный код тестировался и через систему контроля версии собирался в единый файл для отправления на сервер компании, где он пересматривался руководителем по практике. При этом стиль написания кода, архитектура всего приложения остались прежними. При создании новых диалоговых модулей в качестве дизайн-шаблона был использован MVC (Model View Controller).

Вся информация (листинги и изображения) по реализации ПО приведена в приложении 1.

 

Заключение

Пройдя производственную практику в ИПУП “Object Style” мною были выполнены поставленные руководителем задачи по улучшению “CayenneModeler Swing GUI tool”. Был разработан, протестирован и размещён код на сервере компании в соответствии со спецификацией. Приобрёл важный опыт работы программистом в большом проекте, а также получил новые знания и навыки при программировании на языке Java.

 

Список используемой литературы

 

[1] JAVA 2 практическое руководство. И.Н. Блинов/В.С. Романчик.

Издательство: Минск, УП” УниверсалПресс” 2005.

[2] Философия JAVA, 4-е издание. Б. Эккель. Издательство:

Минск, “Питер” 2009.

[3] http://cayenne.apache.org/docs/3.1/tutorial/index.html

[4] http://docs.oracle.com/javase/tutorial/uiswing

[5] http://www.oracle.com

 

Приложение 1

Листинг модуля для генерации классов и схемы базы данных из CAYNNE-проекта:

 

Index: src/main/java/org/apache/cayenne/modeler/ProjectController.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/ProjectController.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/ProjectController.java (working copy)

* nameSuffix allows to address more than one defaults instance for a single

* DataMap.

*/

+ public DataMapDefaults getDataMapPreferences(DataMap dataMap) {

+ Preferences pref;

+ pref = getPreferenceForDataDomain().node("DataMap").node(dataMap.getName());

+

+ return (DataMapDefaults) application.getCayenneProjectPreferences().getProjectDetailObject(

+ DataMapDefaults.class, pref);

+ }

public DataMapDefaults getDataMapPreferences(String nameSuffix) {

- DataMap map = getCurrentDataMap();

+

+ DataMap map=getCurrentDataMap();

+

if (map == null) {

+

throw new CayenneRuntimeException("No DataMap selected");

}

Preferences pref;

+

if (nameSuffix == null || nameSuffix.length() == 0) {

pref = getPreferenceForDataDomain().node("DataMap").node(map.getName());

} else {

@@ -347,6 +365,19 @@

return (DataMapDefaults) application.getCayenneProjectPreferences().getProjectDetailObject(

DataMapDefaults.class, pref);

}

+ public DataMapDefaults getDataMapPreferences(String nameSuffix,DataMap map) {

+ Preferences pref;

+

+ if (nameSuffix == null || nameSuffix.length() == 0) {

+ pref = getPreferenceForDataDomain().node("DataMap").node(map.getName());

+ } else {

+ pref = getPreferenceForDataDomain().node("DataMap").node(map.getName()).node(nameSuffix);

+ }

+ return (DataMapDefaults) application.getCayenneProjectPreferences().getProjectDetailObject(

+ DataMapDefaults.class, pref);

+ }

 

/**

* Returns preferences object for the current DataMap, throwing an exception

 

Index: src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java (working copy)

 

@@ -148,6 +150,8 @@

ProjectAction.class.getName(),

ValidateAction.class.getName(),

SaveAsAction.class.getName(),

+ GenerateCodeAction.class.getName(),

+ GenerateDBAction.class.getName(),

FindAction.class.getName()));

 

DATA_MAP_ACTIONS = new HashSet<String>(DOMAIN_ACTIONS);

DATA_MAP_ACTIONS.addAll(Arrays.asList(

- GenerateCodeAction.class.getName(),

CreateEmbeddableAction.class.getName(),

CreateObjEntityAction.class.getName(),

CreateDbEntityAction.class.getName(),

CreateQueryAction.class.getName(),

CreateProcedureAction.class.getName(),

- GenerateDBAction.class.getName(),

MigrateAction.class.getName(),

InferRelationshipsAction.class.getName(),

CutAction.class.getName(),

CopyAction.class.getName()));

 

OBJ_ENTITY_ACTIONS = new HashSet<String>(DATA_MAP_ACTIONS);

 

 

Index: src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java (working copy)

public class GenerateCodeAction extends CayenneAction {

 

@@ -41,10 +49,22 @@

}

 

public void performAction(ActionEvent e) {

+ Collection<DataMap> dataMaps;

DataMap dataMap = getProjectController().getCurrentDataMap();

+

if (dataMap!= null) {

- new CodeGeneratorController(getApplication().getFrameController(), dataMap)

+ dataMaps=new ArrayList<DataMap>();

+ dataMaps.add(dataMap);

+

+ new CodeGeneratorController(getApplication().getFrameController(), dataMaps)

.startup();

- }

+ }else

+ {

+ Project project=getProjectController().getProject();

+ dataMaps=((DataChannelDescriptor)project.getRootNode()).getDataMaps();

+ new CodeGeneratorController(getApplication().getFrameController(), dataMaps)

+.startup();

+

+ }

}

}

 

Index: src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java (working copy)

@@ -20,6 +20,7 @@

package org.apache.cayenne.modeler.dialog.codegen;

 

import java.awt.Component;

+import java.util.Collection;

 

import javax.swing.JLabel;

 

Index: src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java (working copy)

@@ -60,17 +67,59 @@

}

}

 

- protected DataMapDefaults createDefaults() {

- DataMapDefaults prefs = getApplication()

-.getFrameController()

-.getProjectController()

-.getDataMapPreferences(this.getClass().getName().replace(".", "/"));

+ protected void initDefaults() {

+ TreeMap<DataMap, DataMapDefaults> map =new TreeMap<DataMap, DataMapDefaults>();

+ ArrayList<DataMap> dataMaps = (ArrayList<DataMap>) getParentController().getDataMaps();

+ for(DataMap dataMap: dataMaps)

+ {

+ DataMapDefaults prefs = getApplication()

+.getFrameController()

+.getProjectController()

+.getDataMapPreferences(this.getClass().getName().replace(".", "/"),dataMap);

+

+ prefs.setSuperclassPackage("");

+ prefs.updateSuperclassPackage(dataMap, true);

+

+ map.put(dataMap, prefs);

+

+ if (getOutputPath() == null) {

+ setOutputPath(prefs.getOutputPath());

+ }

+

+ }

+ setMapPreferences(map);

+ }

+

+ protected GeneratorControllerPanel createView() {

+ this.view = new StandardModePanel();

+ this.dataMapLines = new ArrayList<StandartPanelComponent>();

+

+ Set<Entry<DataMap,DataMapDefaults>> enties =getMapPreferences().entrySet();

+ for(Entry<DataMap,DataMapDefaults> entry:enties){

+ StandartPanelComponent dataMapLine= createDataMapLineBy(entry.getKey(), entry.getValue());

+ dataMapLine.getDataMapName().setText(dataMapLine.getDataMap().getName());

+ BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), dataMapLine);

+ builder.bindToTextField(

+ dataMapLine.getSuperclassPackage(),

+ "preferences.superclassPackage").updateView();

+ this.view.addDataMapLine(dataMapLine);

+ this.dataMapLines.add(dataMapLine);

+ }

+

+ return view;

+ }

 

- prefs.updateSuperclassPackage(getParentController().getDataMap(), true);

- this.preferences = prefs;

- return prefs;

+ private StandartPanelComponent createDataMapLineBy(DataMap dataMap,DataMapDefaults preferences)

+ {

+

+ StandartPanelComponent dataMapLine= new StandartPanelComponent();

+ dataMapLine.setDataMap(dataMap);

+ dataMapLine.setPreferences(preferences);

+ return dataMapLine;

+

}

@Override

protected ClassGenerationAction newGenerator() {

return new ClientClassGenerationAction();

Index: src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java (working copy)

@@ -20,6 +20,8 @@

package org.apache.cayenne.modeler.dialog.codegen;

 

import java.awt.Component;

+import java.util.ArrayList;

+import java.util.Collection;

 

import javax.swing.JOptionPane;

 

@@ -32,6 +34,7 @@

import org.apache.commons.collections.PredicateUtils;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

+import org.apache.velocity.runtime.parser.node.SetExecutor;

 

/**

* A controller for the class generator dialog.

@@ -48,13 +51,16 @@

protected ClassesTabController clessSelector;

protected GeneratorTabController generatorSelector;

 

- public CodeGeneratorController(CayenneController parent, DataMap dataMap) {

- super(parent, dataMap);

+ public CodeGeneratorController(CayenneController parent, Collection<DataMap> dataMaps) {

+ super(parent, dataMaps);

 

this.clessSelector = new ClassesTabController(this);

this.generatorSelector = new GeneratorTabController(this);

}

-

+

@Override

public Component getView() {

return view;

@@ -139,11 +145,15 @@

}

 

public void generateAction() {

- ClassGenerationAction generator = generatorSelector.getGenerator();

+

+

+ Collection <ClassGenerationAction> generators = generatorSelector.getGenerator();

 

- if (generator!= null) {

- try {

+ if (generators!= null) {

+ try {

+ for(ClassGenerationAction generator:generators){

generator.execute();

+ }

JOptionPane.showMessageDialog(

this.getView(),

"Class generation finished");

Index: src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java (working copy)

@@ -21,6 +21,7 @@

 

import java.awt.Component;

import java.util.ArrayList;

+import java.util.Collection;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

@@ -46,10 +47,10 @@

 

public static final String SELECTED_PROPERTY = "selected";

 

- protected DataMap dataMap;

+ private Collection<DataMap> dataMaps;

+

+ protected ValidationResult validation;

 

- protected ValidationResult validation;

-

protected List<Object> classes;

 

protected Set selectedEntities;

@@ -57,12 +58,19 @@

 

protected transient Object currentClass;

 

- public CodeGeneratorControllerBase(CayenneController parent, DataMap dataMap) {

+

+

+ public CodeGeneratorControllerBase(CayenneController parent, Collection<DataMap> dataMaps) {

super(parent);

-

- this.dataMap = dataMap;

- this.classes = new ArrayList(dataMap.getObjEntities());

- this.classes.addAll(new ArrayList(dataMap.getEmbeddables()));

+ this.dataMaps = dataMaps;

+ this.classes = new ArrayList();

+

+ for(DataMap dataMap:dataMaps){

+

+ this.classes.addAll(new ArrayList(dataMap.getObjEntities()));

+ this.classes.addAll(new ArrayList(dataMap.getEmbeddables()));

+

+ }

this.selectedEntities = new HashSet();

this.selectedEmbeddables = new HashSet();

}

@@ -70,6 +78,10 @@

public List<Object> getClasses() {

return classes;

}

+

+ public Collection<DataMap> getDataMaps() {

+ return dataMaps;

+ }

 

public abstract Component getView();

 

@@ -251,10 +263,6 @@

this.currentClass = currentClass;

}

 

- public DataMap getDataMap() {

- return dataMap;

- }

-

public JLabel getItemName(Object obj) {

String className;

Icon icon = null;

Index: src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java (working copy)

@@ -53,9 +56,15 @@

this.classesCount = new JLabel("No classes selected");

classesCount.setFont(classesCount.getFont().deriveFont(10f));

+ JScrollPane scrollPane = new JScrollPane(

+ generatorPanel,

+ ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,

+ ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);

+ scrollPane.setPreferredSize(new Dimension(800, 400));

+

// assemble

 

- tabs.addTab("Code Generator", generatorPanel);

+ tabs.addTab("Code Generator", scrollPane);

tabs.addTab("Classes", entitySelectorPanel);

 

JPanel messages = new JPanel(new BorderLayout());

Index: src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java (working copy)

@@ -63,99 +68,149 @@

 

protected ObjectBinding superTemplate;

protected ObjectBinding subTemplate;

+

+ private Collection<StandartPanelComponent> dataMapLines;

+ private CustomPreferencesUpdater preferencesUpdater;

 

- public CustomModeController(CodeGeneratorControllerBase parent) {

+ public CustomPreferencesUpdater getCustomPreferencesUpdater() {

+ return preferencesUpdater;

+ }

+

+ public CustomModeController(CodeGeneratorControllerBase parent) {

super(parent);

 

Object[] modeChoices = new Object[] {

ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL

};

+

view.getGenerationMode().setModel(new DefaultComboBoxModel(modeChoices));

 

// bind preferences and init defaults...

-

- if (Util.isEmptyString(preferences.getSuperclassTemplate())) {

- preferences

-.setSuperclassTemplate(CodeTemplateManager.STANDARD_SERVER_SUPERCLASS);

+

+ Set<Entry<DataMap,DataMapDefaults>> entites =getMapPreferences().entrySet();

+

+ for(Entry<DataMap,DataMapDefaults> entry:entites){

+

+ if (Util.isEmptyString(entry.getValue().getSuperclassTemplate())) {

+ entry.getValue().setSuperclassTemplate(CodeTemplateManager.STANDARD_SERVER_SUPERCLASS);

}

 

- if (Util.isEmptyString(preferences.getSubclassTemplate())) {

- preferences.setSubclassTemplate(CodeTemplateManager.STANDARD_SERVER_SUBCLASS);

+ if (Util.isEmptyString(entry.getValue().getSubclassTemplate())) {

+ entry.getValue().setSubclassTemplate(CodeTemplateManager.STANDARD_SERVER_SUBCLASS);

}

 

- if (Util.isEmptyString(preferences.getProperty("mode"))) {

- preferences.setProperty("mode", MODE_ENTITY);

+ if (Util.isEmptyString(entry.getValue().getProperty("mode"))) {

+ entry.getValue().setProperty("mode", MODE_ENTITY);

}

 

- if (Util.isEmptyString(preferences.getProperty("overwrite"))) {

- preferences.setBooleanProperty("overwrite", false);

+ if (Util.isEmptyString(entry.getValue().getProperty("overwrite"))) {

+ entry.getValue().setBooleanProperty("overwrite", false);

}

 

- if (Util.isEmptyString(preferences.getProperty("pairs"))) {

- preferences.setBooleanProperty("pairs", true);

+ if (Util.isEmptyString(entry.getValue().getProperty("pairs"))) {

+ entry.getValue().setBooleanProperty("pairs", true);

}

 

- if (Util.isEmptyString(preferences.getProperty("usePackagePath"))) {

- preferences.setBooleanProperty("usePackagePath", true);

+ if (Util.isEmptyString(entry.getValue().getProperty("usePackagePath"))) {

+ entry.getValue().setBooleanProperty("usePackagePath", true);

}

 

- if (Util.isEmptyString(preferences.getProperty("outputPattern"))) {

- preferences.setProperty("outputPattern", "*.java");

+ if (Util.isEmptyString(entry.getValue().getProperty("outputPattern"))) {

+ entry.getValue().setProperty("outputPattern", "*.java");

}

-

+ }

+

BindingBuilder builder = new BindingBuilder(

getApplication().getBindingFactory(),

this);

 

builder.bindToAction(view.getManageTemplatesLink(), "popPreferencesAction()");

 

- builder.bindToTextField(

- view.getSuperclassPackage(),

- "preferences.superclassPackage").updateView();

-

builder.bindToComboSelection(

view.getGenerationMode(),

- "preferences.property['mode']").updateView();

+ "customPreferencesUpdater.mode").

+ updateView();

 

builder.bindToStateChange(

view.getOverwrite(),

- "preferences.booleanProperty['overwrite']").updateView();

- builder

-.bindToStateChange(

+ "customPreferencesUpdater.overwrite").

+ updateView();

+

+ builder.bindToStateChange(

view.getPairs(),

- "preferences.booleanProperty['pairs']")

-.updateView();

+ "customPreferencesUpdater.pairs").updateView();

 

builder.bindToStateChange(

view.getUsePackagePath(),

- "preferences.booleanProperty['usePackagePath']").updateView();

+ "customPreferencesUpdater.usePackagePath").updateView();

 

subTemplate = builder.bindToComboSelection(

view.getSubclassTemplate(),

- "preferences.subclassTemplate");

+ "customPreferencesUpdater.subclassTemplate");

 

superTemplate = builder.bindToComboSelection(

view.getSuperclassTemplate(),

- "preferences.superclassTemplate");

+ "customPreferencesUpdater.superclassTemplate");

 

- builder.bindToTextField(

+ builder.bindToTextField(

view.getOutputPattern(),

- "preferences.property['outputPattern']").updateView();

-

+ "customPreferencesUpdater.outputPattern").updateView();

+

updateTemplates();

+

}

-

- protected DataMapDefaults createDefaults() {

- Class obt = this.getClass();

- DataMapDefaults prefs = getApplication()

+

+ protected void initDefaults() {

+

+ TreeMap<DataMap, DataMapDefaults> map =new TreeMap<DataMap, DataMapDefaults>();

+ Collection<DataMap> datamaps = getParentController().getDataMaps();

+

+ for(DataMap dataMap: datamaps)

+ {

+ DataMapDefaults prefs;

+ prefs= getApplication()

.getFrameController()

.getProjectController()

-.getDataMapPreferences(this.getClass().getName().replace(".", "/"));

-

- prefs.updateSuperclassPackage(getParentController().getDataMap(), false);

- this.preferences = prefs;

- return prefs;

+.getDataMapPreferences(this.getClass().getName().replace(".", "/"), dataMap);

+ prefs.setSuperclassPackage("");

+ prefs.updateSuperclassPackage(dataMap, false);

+

+ map.put(dataMap, prefs);

+

+ if (getOutputPath() == null) {

+ setOutputPath(prefs.getOutputPath());

+ }

+

+ }

+ setMapPreferences(map);

+ preferencesUpdater = new CustomPreferencesUpdater(map);

}

+

+ protected GeneratorControllerPanel createView() {

+ this.view = new CustomModePanel();

+ this.dataMapLines = new ArrayList<StandartPanelComponent>();

+

+ Set<Entry<DataMap,DataMapDefaults>> enties =getMapPreferences().entrySet();

+ for(Entry<DataMap,DataMapDefaults> entry:enties){

+ StandartPanelComponent dataMapLine= createDataMapLineBy(entry.getKey(), entry.getValue());

+ dataMapLine.getDataMapName().setText(dataMapLine.getDataMap().getName());

+ BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), dataMapLine);

+ builder.bindToTextField(

+ dataMapLine.getSuperclassPackage(),

+ "preferences.superclassPackage").updateView();

+ this.view.addDataMapLine(dataMapLine);

+ this.dataMapLines.add(dataMapLine);

+ }

+ return view;

+ }

+ private StandartPanelComponent createDataMapLineBy(DataMap dataMap,DataMapDefaults preferences)

+ {

+ StandartPanelComponent dataMapLine= new StandartPanelComponent();

+ dataMapLine.setDataMap(dataMap);

+ dataMapLine.setPreferences(preferences);

+ return dataMapLine;

+ }

 

protected void updateTemplates() {

this.templateManager = getApplication().getCodeTemplateManager();

@@ -183,44 +238,36 @@

superTemplate.updateView();

subTemplate.updateView();

}

-

- protected GeneratorControllerPanel createView() {

- this.view = new CustomModePanel();

- return view;

- }

-

+

public Component getView() {

return view;

}

 

- @Override

- protected ClassGenerationAction newGenerator() {

- return new ClassGenerationAction();

- }

+ public Collection<ClassGenerationAction> createGenerator() {

 

- public ClassGenerationAction createGenerator() {

-

mode = modesByLabel.get(view.getGenerationMode().getSelectedItem()).toString();

+

 

- ClassGenerationAction generator = super.createGenerator();

+ Collection<ClassGenerationAction> generators =super.createGenerator();

 

String superKey = view.getSuperclassTemplate().getSelectedItem().toString();

String superTemplate = templateManager.getTemplatePath(superKey);

- generator.setSuperTemplate(superTemplate);

-

String subKey = view.getSubclassTemplate().getSelectedItem().toString();

String subTemplate = templateManager.getTemplatePath(subKey);

- generator.setTemplate(subTemplate);

-

+

+ for(ClassGenerationAction generator: generators){

+ generator.setSuperTemplate(superTemplate);

+ generator.setTemplate(subTemplate);

generator.setOverwrite(view.getOverwrite().isSelected());

generator.setUsePkgPath(view.getUsePackagePath().isSelected());

generator.setMakePairs(view.getPairs().isSelected());

 

if (!Util.isEmptyString(view.getOutputPattern().getText())) {

generator.setOutputPattern(view.getOutputPattern().getText());

+ }

}

- return generator;

+ return generators;

}

 

public void popPreferencesAction() {

@@ -228,4 +275,15 @@

.startupAction(PreferenceDialog.TEMPLATES_KEY);

updateTemplates();

}

+

+ @Override

+ public Collection<StandartPanelComponent> getDataMapLines() {

+ return dataMapLines;

+ }

+ @Override

+ protected ClassGenerationAction newGenerator() {

+ return new ClassGenerationAction();

+ }

+

}

Index: src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java (revision 1484403)

+++ src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java (working copy)

 

@@ -44,7 +48,12 @@

protected JCheckBox overwrite;

protected JCheckBox usePackagePath;

protected JTextField outputPattern;

+

+ // private PanelBuilder builder;

+ private DefaultFormBuilder builder;

 

+ private CellConstraints cc;

+

protected ActionLink manageTemplatesLink;

 

public CustomModePanel() {

@@ -68,49 +77,66 @@

 

// assemble

 

- PanelBuilder builder = new PanelBuilder(

+ /* builder = new PanelBuilder(

new FormLayout(

"right:70dlu, 3dlu, fill:150dlu:grow, 3dlu, pref",

- "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p"));

+ "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p"));*/

+

+ FormLayout layout = new FormLayout(

+ "right:77dlu, 3dlu, fill:200:grow, 6dlu, fill:50dlu, 3dlu", "");

+ builder = new DefaultFormBuilder(layout);

builder.setDefaultDialogBorder();

-

- CellConstraints cc = new CellConstraints();

-

- builder.addLabel("Output Directory:", cc.xy(1, 1));

+

+ builder.append("Output Directory:", outputFolder,selectOutputFolder);

+ builder.nextLine();

+

+ builder.append("Generation Mode:", generationMode);

+ builder.nextLine();

+

+ builder.append("Subclass Template:", subclassTemplate);

+ builder.nextLine();

+

+ builder.append("Superclass Template:", superclassTemplate);

+ builder.nextLine();

+

+ builder.append("Output Pattern:", outputPattern);

+ builder.nextLine();

+

+ builder.append("Make Pairs:", pairs);

+ builder.nextLine();

+

+ builder.append("Overwrite Subclasses:", overwrite);

+ builder.nextLine();

+

+ builder.append("Use Package Path:", usePackagePath);

+ builder.nextLine();

+

+ // cc = new CellConstraints();

+

+ scrollPane.setPreferredSize(new Dimension(200, 200));

+

+ add(scrollPane, BorderLayout.CENTER);*/

+ add(builder.getPanel(), BorderLayout.CENTER);

}

+

+ public void addDataMapLine(JComponent dataMapLine)

+ {

+ builder.append(dataMapLine,4);

+ builder.nextLine();

+ }

 

public JComboBox getGenerationMode() {

return generationMode;

Index: src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java

===================================================================

--- src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java (revision 0)

+++ src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java (working copy)

@@ -0,0 +1,157 @@

+public class CustomPreferencesUpdater{

+

+ enum Property{

+ SUBCLASS_TEMPLATE,

+ SUPERCLASS_TEMPLATE,

+ OVERWRITE,

+ PAIRS,

+ USE_PACKEGE_PATH,

+ MODE,

+ OUTPUT_PATTERN

+ }

+

+ private static final String OVERWRITE="overwrite";

+ private static final String PAIRS="pairs";

+ private static final String USE_PACKEGE_PATH="usePackagePath";

+ private static final String MODE="mode";

+ private static final String OUTPUT_PATTERN="outputPattern";

+

+ private Map<DataMap, DataMapDefaults> mapPreferences;

+

+

+ public CustomPreferencesUpdater(Map<DataMap, DataMapDefaults> mapPreferences){

+ this.mapPreferences=mapPreferences;

+ }

+

+ public String getMode() {

+ return (String) getProperty(Property.MODE);

+ }

+

+ public void setMode(String mode){

+ updatePreferences(Property.MODE, mode);

+ }

+

+ public String getSubclassTemplate() {

+ return (String) getProperty(Property.SUBCLASS_TEMPLATE);

+ }

+

+ public void setSubclassTemplate(String subclassTemplate) {

+ updatePreferences(Property.SUBCLASS_TEMPLATE,subclassTemplate);

+ }

+

+ public String getSuperclassTemplate() {

+ return (String) getProperty(Property.SUPERCLASS_TEMPLATE);

+ }

+

+ public void setSuperclassTemplate(String superclassTemplate) {

+ updatePreferences(Property.SUPERCLASS_TEMPLATE, superclassTemplate);

+ }

+

+ public Boolean getOverwrite() {

+ return (Boolean) getProperty(Property.OVERWRITE);

+ }

+

+ public void setOverwrite(Boolean overwrite) {

+ updatePreferences(Property.OVERWRITE, overwrite);

+ }

+

+ public Boolean getPairs() {

+ return (Boolean) getProperty(Property.PAIRS);

+ }

+

+ public void setPairs(Boolean pairs) {

+ updatePreferences(Property.PAIRS, pairs);

+ }

+

+ public Boolean getUsePackagePath() {

+ return (Boolean) getProperty(Property.USE_PACKEGE_PATH);

+ }

+

+ public void setUsePackagePath(Boolean usePackagePath) {

+ updatePreferences(Property.USE_PACKEGE_PATH, usePackagePath);

+ }

+

+ public String getOutputPattern() {

+ return (String) getProperty(Property.OUTPUT_PATTERN);

+ }

+

+ public void setOutputPattern(String outputPattern) {

+ updatePreferences(Property.OUTPUT_PATTERN, outputPattern);

+ }

+

+

+ private Object getProperty(Property property){

+ Object obj=null;

+

+ Set<Entry<DataMap,DataMapDefaults>> entites =mapPreferences.entrySet();

+ for(Entry<DataMap,DataMapDefaults> entry:entites){

+

+ switch(property){

+ case MODE:

+ obj= entry.getValue().getProperty(MODE);

+ break;

+ case OUTPUT_PATTERN:

+ obj= entry.getValue().getProperty(OUTPUT_PATTERN);

+ break;

+ case SUBCLASS_TEMPLATE:

+ obj= entry.getValue().getSubclassTemplate();

+ break;

+ case SUPERCLASS_TEMPLATE:

+ obj= entry.getValue().getSuperclassTemplate();

+ break;

+ case OVERWRITE:

+ obj= entry.getValue().getBooleanProperty(OVERWRITE);

+ break;

+ case PAIRS:

+ obj= entry.getValue().getBooleanProperty(PAIRS);

+ break;

+ case USE_PACKEGE_PATH:

+ obj= entry.getValue().getBooleanProperty(USE_PACKEGE_PATH);

+ break;

+ default: throw new IllegalArgumentException("Bad type property: " + property);

+ }

+

+ }

+ return obj;

+ }

+

+ private void updatePreferences(Property property,Object value){

+ Set<Entry<DataMap,DataMapDefaults>> entites =mapPreferences.entrySet();

+ for(Entry<DataMap,DataMapDefaults> entry:entites){

+

+ switch(property){

+ case MODE:

+ entry.getValue().setProperty(MODE, (String)value);

+ break;

+ case OUTPUT_PATTERN:

+ entry.getValue().setProperty(OUTPUT_PATTERN, (String)value);

+ break;

+ case SUBCLASS_TEMPLATE:

+ entry.getValue().setSubclassTemplate((String)value);

+ break;

+ case SUPERCLASS_TEMPLATE:

+ entry.getValue().setSuperclassTemplate((String) value);

+ break;

+ case OVERWRITE:

+ entry.getValue().setBooleanProperty(OVERWRITE, (Boolean) value);

+ break;

+ case PAIRS:

+ entry.getValue().setBooleanProperty(PAIRS, (Boolean) value);

+ break;

+ case USE_PACKEGE_PATH:

+ entry.getValue().setBooleanProperty(USE_PACKEGE_PATH, (Boolean) value);

+ break;

+ default: throw new IllegalArgumentException("Bad type property: " + property);

+ }

+ }

+ }

+}

 

 

Рис.1: Генерация классов и схемы для всех DataMap

Рис.2: Генерация схемы базы данных

Рис.2: Генерация классов, Advanced mode

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...