ENTAXY-374 release 1.8.2
This commit is contained in:
		| @@ -1897,7 +1897,7 @@ | ||||
|                 "system-management" | ||||
|               ] | ||||
|             }, | ||||
|             "description": "Создать сразу несколько доступов, которым разрешено отправлять сообщения от данной системы, можно с помощью метода сreatePermissionForObjectRequest, где “objectUuid” это uuid системы, от которой буду исходить сообщения, ‘“subjectUuid1”, “subjectUuid2” и т д, это uuid систем, которым будут отправлять сообщения\n" | ||||
|             "description": "Создать сразу несколько доступов, которым разрешено отправлять сообщения от данной системы, можно с помощью метода createPermissionForObjectRequest, где “objectUuid” это uuid системы, от которой буду исходить сообщения, ‘“subjectUuid1”, “subjectUuid2” и т д, это uuid систем, которым будут отправлять сообщения\n" | ||||
|           }, | ||||
|           "response": [] | ||||
|         }, | ||||
| @@ -1979,7 +1979,7 @@ | ||||
|                 "system-management" | ||||
|               ] | ||||
|             }, | ||||
|             "description": "Создать сразу несколько доступов, которым разрешено отправлять сообщения в данную систему, можно с помощью метода сreatePermissionForSubjectRequest, где “objectUuid1”, “objectUuid2” и т д - это uuid систем, от которых буду исходить сообщения, ‘“subjectUuid” - это uuid системы, которой будут отправлять сообщения\n" | ||||
|             "description": "Создать сразу несколько доступов, которым разрешено отправлять сообщения в данную систему, можно с помощью метода createPermissionForSubjectRequest, где “objectUuid1”, “objectUuid2” и т д - это uuid систем, от которых буду исходить сообщения, ‘“subjectUuid” - это uuid системы, которой будут отправлять сообщения\n" | ||||
|           }, | ||||
|           "response": [] | ||||
|         } | ||||
| @@ -2973,7 +2973,7 @@ | ||||
|                 "schema" | ||||
|               ] | ||||
|             }, | ||||
|             "description": "Для корректирования мета информации ресурса в шине есть метод еditResourceInfo.\n\n\n\n\n" | ||||
|             "description": "Для корректирования мета информации ресурса в шине есть метод editResourceInfo.\n\n\n\n\n" | ||||
|           }, | ||||
|           "response": [] | ||||
|         }, | ||||
|   | ||||
| @@ -64,7 +64,7 @@ redelivery.redeliveryDelay=5000 | ||||
|  | ||||
| #cron - по умолчанию запускается каждые 00:00:00, | ||||
| #cron выражение использует знак "+" как разделитель для модуля quartz2l | ||||
| quirtz.job.clean.cron=0+0+0+*+*+?+* | ||||
| quartz.job.clean.cron=0+0+0+*+*+?+* | ||||
| ---- | ||||
|  | ||||
| - _ru.entaxy.esb.system.event.rest.cfg_ | ||||
| @@ -550,6 +550,6 @@ _POST server:9090/topic-subscription/publish_ | ||||
|  | ||||
| Т.к. удаление топиков происходит в 2 этапа, с помощью планировщика _Quartz2_, работающего в кластере, запускается задача по очистке. Запуск происходит в конкурентном режиме, узел первый запустивший задачу получает приоритет, на остальных узлах задача останавливается до следующего запуска. | ||||
|  | ||||
| Частота запуска задачи настраивается в конфигурационном файле  _ru.entaxy.esb.system.event.handler.cfg_ в свойстве quirtz.job.clean.cron=0+0+0+*+*+?+* | ||||
| Частота запуска задачи настраивается в конфигурационном файле  _ru.entaxy.esb.system.event.handler.cfg_ в свойстве quartz.job.clean.cron=0+0+0+*+*+?+* | ||||
| с помощью cron выражения. Особенность cron выражения для quartz в том что “++” используется, как разделитель. | ||||
|  | ||||
|   | ||||
							
								
								
									
										171
									
								
								documentation/extras/eav.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								documentation/extras/eav.adoc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,171 @@ | ||||
| = Хранилище данных EAV | ||||
|  | ||||
| == Описание модуля EXTRAS :: ENTAXY :: EAV (Entity, Attribute, Value) | ||||
|  | ||||
| Хранилище данных EAV реализует модель _Сущность-Атрибут-Значение_ - это модель данных, предназначенная для описания сущностей, в которых количество атрибутов (свойств, параметров) не ограничено или не известно заранее. | ||||
|   | ||||
|  | ||||
| == Объекты модуля ЕАV | ||||
|  | ||||
| image::eav_objects.png[] | ||||
|  | ||||
| *Внешняя сущность*(External Entity) - любая внешняя сущность относительно модуля EAV. | ||||
|  | ||||
| *Сущность EAV*(Entity EAV) - именованная сущность, связывающая аттрибуты с внешней сущностью. | ||||
| 	Модуль предоставляет возможность объединять сущности EAV в одноуровневую иерархию. | ||||
| 	 | ||||
| *Атрибут*(Attribute) - именованный атрибут сущности EAV, содержит значение и его тип. | ||||
|  | ||||
| *Типы значений:* | ||||
|  | ||||
| * DOUBLE | ||||
| * LONG | ||||
| * TEXT | ||||
| * JSON | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| == Использование хранилища EAV | ||||
|  | ||||
| В BLUEPRINT подключаем OSGI-сервис EAVProcessor | ||||
| [source] | ||||
| ---- | ||||
| <reference id="eavProcessor" interface="ru.entaxy.eav.service.EAVProcessor"/> | ||||
| ---- | ||||
|  | ||||
| в маршрутах или java коде осуществляем необходимые вызовы для создания/получения/изменения значений. | ||||
|  | ||||
| *Примеры вызовов из маршрута Apache Camel XMLDSL* | ||||
|  | ||||
| Создание атрибута для внешней сущности | ||||
| [source] | ||||
| ---- | ||||
| <bean ref="eavProcessor" method="createPrimitive('externalIdTest', 'externalTypeTest', 'entityNameTest', 'attributeNameTest', 'textValue', 'testLogin')"/> | ||||
| ---- | ||||
| 	 | ||||
| Получить все значения сохранённой сущности | ||||
| [source] | ||||
| ---- | ||||
| <bean ref="eavProcessor" method="getEntityWithValues('externalIdTest', 'externalTypeTest', 'entityNameTest')"/> | ||||
| ---- | ||||
| 	 | ||||
| Удалить сохранённые значения | ||||
| [source] | ||||
| ---- | ||||
| <bean ref="eavProcessor" method="deleteExternalEntity('externalIdTest', 'externalTypeTest')"/> | ||||
| ---- | ||||
|  | ||||
| 	 | ||||
|  | ||||
| == OSGI-сервис EAVProcessor. | ||||
| Сервис, выставляющий api для работы с EAV хранилищем. | ||||
|  | ||||
|  | ||||
|  | ||||
| *Методы:* | ||||
|  | ||||
| * _createPrimitive_ - простой метод сохранения примитивного значения(числового, строкового) | ||||
| * _createComplex_ - простой метод сохранения комплексного значения(JSON) | ||||
| * _getEntityWithValues_ - получение значений сущности EAV по имени | ||||
| * _fetchEntityWithValues_ - получение значений сущности EAV по имени либо null, без исключений | ||||
| * _getEntityNamedAttributes_ - получение значений с определённым именем для сущности EAV  | ||||
| * _getEntityByNameAndAttributeValue_ - получение сущности EAV по атрибуту | ||||
| * _getParentEntity_ - получение родительской сущности EAV для внешней связанной сущности | ||||
| * _getChildEntities_ - получение дочерних сущностей EAV для внешней связанной сущности с именем сущности EAV по умолчанию(PARENT) | ||||
| * _getChildEntitiesByName_ - получение дочерних сущностей EAV для внешней связанной сущности с указанным именем сущности EAV | ||||
| * _getByExternalEntity_ - получение всех сущностей EAV для внешней связанной сущности | ||||
| * _getByAttributeSet_ - получение сущностей EAV по множественным наборов параметров, каждый набор составляется из значений элементов с одним порядковым номером всех списков  | ||||
| * _updateAttribute_ - метод для изменения значения аттрибута | ||||
| * _deleteExternalEntity_ - удаление всех записей связанных с внешней сущностью | ||||
| * _deleteEntity_ - удаление именованной сущности EAV | ||||
| * _deleteAllEntityAttributes_ - удаление атрибутов именованной сущности EAV | ||||
| * _deleteAllEntityAttributesByName_ - удаление аттрибута сущности EAV с определённым наименованием  | ||||
| * _combineEntities_ - метод для объединения внешних сущностей под 1 родителем | ||||
|  | ||||
|  | ||||
|  | ||||
| == Схема базы данных(БД). | ||||
|  | ||||
| Схема БД при таком подходе остаётся неизменной независимо от состава и структуры хранимых данных. | ||||
| Бандл eav-storage разворачивает структуру из 2 таблиц: | ||||
|  | ||||
| *Таблица eav_entity* | ||||
| |=== | ||||
| |Слолбец	|Параметры    |Описание   | ||||
| //---------------------- | ||||
| |id    | ||||
| |bigint, not null    | ||||
| |идентификатор сущности модуля EAV | ||||
|  | ||||
| |external_id    | ||||
| |text, not null   | ||||
| |внешний идентификатор связываемой сущности | ||||
|  | ||||
| |external_type    | ||||
| |text, not null    | ||||
| |тип связываемой сущности | ||||
|  | ||||
| |name    | ||||
| |text    | ||||
| |наименование сущности модуля EAV | ||||
|  | ||||
| |parent_id    | ||||
| |bigint, not null, default 0    | ||||
| |идентификатор(поле id) родительской сущности модуля EAV | ||||
|  | ||||
| |create_date    | ||||
| |timestamp, not null   | ||||
| |служебное поле, дата создания | ||||
|  | ||||
| |edit_date    | ||||
| |timestamp | ||||
| |служебное поле, дата изменения | ||||
|  | ||||
| |created_by    | ||||
| |text, not null    | ||||
| |служебное поле, логин автора записи | ||||
|  | ||||
| |external_type    | ||||
| |text    | ||||
| |служебное поле, логин последнего изменившего сущность | ||||
| |=== | ||||
|  | ||||
|  | ||||
| *Таблица eav_attribute* | ||||
| |=== | ||||
| |Слолбец	|Параметры    |Описание   | ||||
| //---------------------- | ||||
| |id    | ||||
| |bigint, not null   | ||||
| |идентификатор атрибута | ||||
|  | ||||
| |entity_id    | ||||
| |text, not null   | ||||
| |идентификатор сущности eav_entity | ||||
|  | ||||
| |name    | ||||
| |text, not null    | ||||
| |наименование аттрибута | ||||
|  | ||||
| |type    | ||||
| |text    | ||||
| |тип аттрибута | ||||
|  | ||||
| |double    | ||||
| |double   | ||||
| |служебное поле для хранения значения | ||||
|  | ||||
| |long    | ||||
| |bigint  | ||||
| |служебное поле для хранения значения | ||||
|  | ||||
| |text    | ||||
| |text   | ||||
| |служебное поле для хранения значения | ||||
|  | ||||
| |text2    | ||||
| |text    | ||||
| |служебное поле для хранения значения | ||||
|  | ||||
| |=== | ||||
							
								
								
									
										
											BIN
										
									
								
								documentation/extras/eav_objects.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								documentation/extras/eav_objects.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 21 KiB | 
| @@ -18,8 +18,8 @@ _Для разработчиков: | ||||
| -имеет Api, который занимается Crud операциями, | ||||
| -хранит учетные записи в базе данных, | ||||
| -предоставляет файл с актуальной информацией для nginx, | ||||
| -выставляет interсeptor для аутентификации в других сервисах, | ||||
| -выставляет interсeptor для определения принадлежности аккаунта определённой системе._ | ||||
| -выставляет interceptor для аутентификации в других сервисах, | ||||
| -выставляет interceptor для определения принадлежности аккаунта определённой системе._ | ||||
|  | ||||
|  | ||||
| === permission | ||||
| @@ -32,7 +32,7 @@ _Для разработчиков: | ||||
| -имеет Api, который занимается Crud операциями | ||||
| - хранит права в базе данных, | ||||
| -(camel)компонент, который используется в маршрутах, для проверки возможности отправки из системы a в систему b. | ||||
| -выставляет interсeptor для авторизации в служебных сервисах._ | ||||
| -выставляет interceptor для авторизации в служебных сервисах._ | ||||
|  | ||||
|  | ||||
| === system-management-api | ||||
|   | ||||
| @@ -21,7 +21,7 @@ __Alternative languages:__ | ||||
|  | ||||
| == Дистрибутивы Entaxy | ||||
|  | ||||
| Сущетсвет несколько вариантов сборок Entaxy, которые доступны по адресу https://entaxy.ru/download  | ||||
| Существует несколько вариантов сборок Entaxy, которые доступны по адресу https://entaxy.ru/download | ||||
|  | ||||
| . `entaxy-assembly-compact*` - все-в-одном, брокер, бд и графический веб-интерфейс в одной сборке. См. xref:#_установка_all_in_one [Установка all-in-one] | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <artifactId>root</artifactId> | ||||
|         <groupId>ru.entaxy.esb</groupId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.platform.runtime</groupId> | ||||
|     <artifactId>base</artifactId> | ||||
|     <version>1.8.1</version> | ||||
|     <version>1.8.2</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
|   <artifactId>base-support</artifactId> | ||||
| @@ -17,6 +17,7 @@ | ||||
|   		ru.entaxy.platform.base.support.xml, | ||||
|   		ru.entaxy.platform.base.support.osgi, | ||||
|   		ru.entaxy.platform.base.support.osgi.tracker, | ||||
|   		ru.entaxy.platform.base.support.osgi.tracker.filter, | ||||
|   		ru.entaxy.platform.base.support.osgi.filter | ||||
|   	</bundle.osgi.export.pkg> | ||||
|   </properties> | ||||
|   | ||||
| @@ -0,0 +1,54 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.support; | ||||
|  | ||||
| import java.util.LinkedList; | ||||
| import java.util.List; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| public class DependencySorter { | ||||
|  | ||||
| 	public static interface DependencyProvider<T> { | ||||
| 		List<T> getDependencies(T inspectedObject); | ||||
| 	} | ||||
| 	 | ||||
| 	public static <T> List<T> getSortedList(List<T> origin, DependencyProvider<T> provider) throws Exception { | ||||
| 		List<T> result = new LinkedList<>(); | ||||
| 		 | ||||
| 		// add independent objects | ||||
| 		result.addAll( | ||||
| 			origin.stream().filter(obj -> provider.getDependencies(obj).isEmpty()) | ||||
| 			.collect(Collectors.toList()) | ||||
| 				); | ||||
| 		 | ||||
| 		while (result.size() < origin.size()) { | ||||
| 			List<T> nextObjects = origin.stream().filter(obj->!result.contains(obj)) | ||||
| 				.filter(obj->result.containsAll(provider.getDependencies(obj))) | ||||
| 				.collect(Collectors.toList()); | ||||
| 			if (nextObjects.isEmpty()) | ||||
| 				// TODO create more informative exception | ||||
| 				throw new Exception("Contains unsatisfied dependencies"); | ||||
| 			result.addAll(nextObjects); | ||||
| 		} | ||||
| 		 | ||||
| 		return result; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -39,7 +39,7 @@ public class FileUtils { | ||||
| 		protected String md5FilePath = ""; | ||||
| 		protected String currentMd5 = null; | ||||
| 		 | ||||
| 		protected String timmestampFilePath = ""; | ||||
| 		protected String timestampFilePath = ""; | ||||
| 		protected String currentTimestamp = null; | ||||
| 		 | ||||
| 		public FileHelper(String filePath) { | ||||
| @@ -49,7 +49,7 @@ public class FileUtils { | ||||
| 		public FileHelper(File file) { | ||||
| 			this.file = file; | ||||
| 			this.md5FilePath = file.getAbsolutePath().concat(".md5"); | ||||
| 			this.timmestampFilePath = file.getAbsolutePath().concat(".timestamp"); | ||||
| 			this.timestampFilePath = file.getAbsolutePath().concat(".timestamp"); | ||||
| 		} | ||||
| 		 | ||||
| 		public boolean isReadable() { | ||||
| @@ -59,7 +59,7 @@ public class FileUtils { | ||||
| 		protected String calcMd5() { | ||||
| 			if (!CommonUtils.isValid(this.fileMd5Hash)) | ||||
| 				try { | ||||
| 					this.fileMd5Hash = DigestUtils.md2Hex(this.file.toURI().toURL().openStream()); | ||||
| 					this.fileMd5Hash = DigestUtils.md5Hex(this.file.toURI().toURL().openStream()); | ||||
| 				} catch (MalformedURLException e) { | ||||
| 					e.printStackTrace(); | ||||
| 				} catch (IOException e) { | ||||
| @@ -85,7 +85,7 @@ public class FileUtils { | ||||
| 		public String getTimestamp() { | ||||
| 			if (this.currentTimestamp == null) | ||||
| 				try { | ||||
| 					this.currentTimestamp = Files.readString((new File(this.timmestampFilePath)).toPath()); | ||||
| 					this.currentTimestamp = Files.readString((new File(this.timestampFilePath)).toPath()); | ||||
| 				} catch (IOException e) { | ||||
| 					this.currentTimestamp = "";  | ||||
| 				} | ||||
| @@ -121,7 +121,7 @@ public class FileUtils { | ||||
| 			String timestamp = Calendar.getInstance().getTimeInMillis() + ""; | ||||
| 			String result = ""; | ||||
| 			try { | ||||
| 				FileUtils.string2file(timestamp, timmestampFilePath); | ||||
| 				FileUtils.string2file(timestamp, timestampFilePath); | ||||
| 				this.currentTimestamp = null; | ||||
| 				result = getTimestamp(); | ||||
| 			} catch (IOException e) { | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
| /* ~~~~~~licensing~~~~~~ | ||||
|  * base-support | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2021 EmDev LLC | ||||
| @@ -25,10 +24,12 @@ import java.io.InputStreamReader; | ||||
| import java.net.URL; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
| import java.util.Set; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import com.google.gson.JsonArray; | ||||
| @@ -108,10 +109,283 @@ public class JSONUtils { | ||||
| 						  url.openStream(), StandardCharsets.UTF_8)) | ||||
| 					.lines() | ||||
| 					.collect(Collectors.joining("\n")); | ||||
| 		return JSONUtils.getJsonRootObject(metadata); | ||||
| 	} | ||||
| 	 | ||||
| 	public static JsonObject getJsonRootObject(String jsonData) { | ||||
| 		try { | ||||
| 			JsonElement je = (new JsonParser()).parse(jsonData); | ||||
| 			JsonObject root = je.getAsJsonObject();		 | ||||
| 			return root; | ||||
| 		} catch (Exception e) { | ||||
| 			return new JsonObject(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public static void mergeObjects(JsonObject source, JsonObject target) { | ||||
| 		if (source == null) | ||||
| 			return; | ||||
| 		if (target == null) | ||||
| 			return; | ||||
| 		for (Entry<String, JsonElement> entry: source.entrySet()) { | ||||
| 			if (target.has(entry.getKey())) { | ||||
| 				if (entry.getValue().isJsonObject()) | ||||
| 					if (target.get(entry.getKey()).isJsonObject()) { | ||||
| 						mergeObjects(entry.getValue().getAsJsonObject(), target.get(entry.getKey()).getAsJsonObject()); | ||||
| 						continue; | ||||
| 					} | ||||
| 				target.remove(entry.getKey()); | ||||
| 			} | ||||
| 			target.add(entry.getKey(), entry.getValue().deepCopy()); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	public static boolean replaceValue(JsonObject origin, String path, JsonElement replacement) { | ||||
| 		return setValue(origin, path, replacement, false); | ||||
| 	} | ||||
| 	 | ||||
| 	public static boolean setValue(JsonObject origin, String path, JsonElement replacement, boolean ifMissing) { | ||||
| 		String preparedPath = path.replaceAll("(\\[\\d+\\])", ".$1"); | ||||
| 		String[] pathSplitted = preparedPath.split("\\."); | ||||
| 		JsonElement currentElement = origin; | ||||
| 		for (int i=0; i<pathSplitted.length-1; i++) { | ||||
| 			String fragment = pathSplitted[i]; | ||||
| 			if (fragment.startsWith("[") && fragment.endsWith("]")) { | ||||
| 				// array index | ||||
| 				if (currentElement.isJsonArray()) { | ||||
| 					int index = Integer.parseInt(fragment.substring(1, fragment.length()-1)); | ||||
| 					JsonArray arr = currentElement.getAsJsonArray(); | ||||
| 					if (arr.size()>index) | ||||
| 						currentElement = arr.get(index); | ||||
| 					else { | ||||
| 						// TODO process  | ||||
| 						// System.out.println("ERROR: index out of bounds"); | ||||
| 					} | ||||
| 				} else { | ||||
| 					// TODO process | ||||
| 					// System.out.println("ERROR: found indexed property on non-array value"); | ||||
| 				}  | ||||
| 			} else if (currentElement.isJsonObject()) { | ||||
| 					currentElement = currentElement.getAsJsonObject().get(fragment); | ||||
| 			} else { | ||||
| 				// TODO process | ||||
| 				// System.out.println("ERROR: currentElement can't be traversed"); | ||||
| 			} | ||||
| 		} | ||||
| 		if (currentElement == null) { | ||||
| 			// System.out.println("ERROR: currentElement is null"); | ||||
| 			return false; | ||||
| 		} | ||||
| 		String finalFragment = pathSplitted[pathSplitted.length-1]; | ||||
| 		if (finalFragment.startsWith("[") && finalFragment.endsWith("]")) { | ||||
| 			// array index | ||||
| 			if (currentElement.isJsonArray()) { | ||||
| 				// System.out.println("INDEX: [" + finalFragment.substring(1, finalFragment.length()-1) + "]"); | ||||
| 				int index = Integer.parseInt(finalFragment.substring(1, finalFragment.length()-1)); | ||||
| 				JsonArray arr = currentElement.getAsJsonArray(); | ||||
| 				if (arr.size()>index) { | ||||
| 					// arr.remove(index); | ||||
| 					arr.set(index, replacement); | ||||
| 				} else { | ||||
| 					// TODO process | ||||
| 					// System.out.println("ERROR: index out of bounds"); | ||||
| 				} | ||||
| 			} else { | ||||
| 				// TODO process | ||||
| 				// System.out.println("ERROR: found indexed property on non-array value"); | ||||
| 			}  | ||||
| 		} else if (currentElement.isJsonObject()) { | ||||
| 			if (ifMissing && currentElement.getAsJsonObject().has(finalFragment)) | ||||
| 				return false; | ||||
| 			currentElement.getAsJsonObject().remove(finalFragment); | ||||
| 			currentElement.getAsJsonObject().add(finalFragment, replacement); | ||||
| 		} else { | ||||
| 			// System.out.println("ERROR: currentElement can't be traversed"); | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		// System.out.println("\n -- found --\n" + currentElement.toString() + "\n"); | ||||
| 		return true; | ||||
| 	}	 | ||||
| 	 | ||||
| 	public static class JsonTraverse { | ||||
| 	 | ||||
| 		List<ObjectChecker> checkers = new ArrayList<>(); | ||||
| 		 | ||||
| 		public JsonTraverse checker(ObjectChecker checker) { | ||||
| 			this.checkers.add(checker); | ||||
| 			return this; | ||||
| 		} | ||||
| 		 | ||||
| 		public Object traverse(JsonObject rootObject) { | ||||
| 			Object result = null; | ||||
| 			 | ||||
| 			Map<String, Object> context = new HashMap<>(); | ||||
| 			 | ||||
| 			result = element2object(rootObject, context, "$");  | ||||
| 			 | ||||
| 			return result; | ||||
| 		} | ||||
| 		 | ||||
| 		protected Object element2object(JsonElement element, Map<String, Object> context, String path) { | ||||
| 			if (element.isJsonNull() || element.isJsonPrimitive()) | ||||
| 				return element2value(element, context, path); | ||||
| 			if (element.isJsonArray()) | ||||
| 				return element2list(element, context, path); | ||||
| 			if (element.isJsonObject()) { | ||||
| 				JsonObject jsonObject = element.getAsJsonObject(); | ||||
| 				ObjectWrapper ow = null; | ||||
| 				for (ObjectChecker oc: checkers) { | ||||
| 					ow = oc.checkObject(jsonObject); | ||||
| 					if (ow != null) | ||||
| 						break; | ||||
| 				} | ||||
| 				 | ||||
| 				if (ow != null) { | ||||
| 					ow.wrap(jsonObject, context, path); | ||||
| 					if (ow.continueTraverse()) | ||||
| 						ow.setTraverseMap(element2map(element, context, path), context); | ||||
| 					return ow; | ||||
| 				} | ||||
| 				 | ||||
| 				return element2map(element, context, path); | ||||
| 			} | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		protected Map<String, Object> element2map(JsonElement element, Map<String, Object> context, String path){ | ||||
| 			Map<String, Object> result = new HashMap<>(); | ||||
| 			if (element.isJsonObject()) { | ||||
| 				JsonObject jsonObject = element.getAsJsonObject(); | ||||
| 				for (Entry<String, JsonElement> entry: jsonObject.entrySet()) { | ||||
| 					result.put(entry.getKey(), element2object(entry.getValue(), context, path + "." + entry.getKey())); | ||||
| 				} | ||||
| 			} else  | ||||
| 			if (element.isJsonArray()) { | ||||
| 				JsonArray array = element.getAsJsonArray(); | ||||
| 				result.put(PROP_VALUE, element2list(element, context, path)); | ||||
| 			} else | ||||
| 			if (element.isJsonNull()) { | ||||
| 				result.put(PROP_VALUE, null); | ||||
| 			} else | ||||
| 			if (element.isJsonPrimitive()) { | ||||
| 				result.put(PROP_VALUE, element2value(element, context, path)); | ||||
| 			} | ||||
|  | ||||
| 			return result; | ||||
| 		} | ||||
| 		 | ||||
| 		protected Object element2value(JsonElement element, Map<String, Object> context, String path) { | ||||
| 			Object result = null; | ||||
| 			if (element.isJsonNull() || !element.isJsonPrimitive()) | ||||
| 				return result; | ||||
| 			try { | ||||
| 				JsonPrimitive primitive = element.getAsJsonPrimitive(); | ||||
| 				if (primitive.isNumber()) | ||||
| 					result = primitive.getAsNumber(); | ||||
| 				else if (primitive.isBoolean()) | ||||
| 					result = primitive.getAsBoolean(); | ||||
| 				else result = primitive.getAsString(); | ||||
| 			} catch (Exception e1) { | ||||
| 				try { | ||||
| 					result = element.getAsBoolean(); | ||||
| 				} catch (Exception e2) { | ||||
| 					result = element.getAsString(); | ||||
| 				} | ||||
| 			} | ||||
| 			return result; | ||||
| 		} | ||||
|  | ||||
| 		protected List<Object> element2list(JsonElement element, Map<String, Object> context, String path) { | ||||
| 			List<Object> result = new ArrayList<>(); | ||||
| 			JsonArray array = element.getAsJsonArray(); | ||||
| 			for (int i=0; i<array.size(); i++) | ||||
| 				result.add(element2object(array.get(i), context, path + "[" + i + "]")); | ||||
| 			return result; | ||||
| 		} | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	public static abstract class ObjectChecker { | ||||
| 		 | ||||
| 		public abstract ObjectWrapper checkObject(JsonObject object); | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	public static abstract class ObjectWrapper implements Map<String, Object> { | ||||
| 		 | ||||
| 		protected Map<String, Object> data = new HashMap<>(); | ||||
| 		 | ||||
| 		public abstract void wrap(JsonObject object, Map<String, Object> context, String path); | ||||
| 		 | ||||
| 		public boolean continueTraverse() { | ||||
| 			return true; | ||||
| 		} | ||||
| 		 | ||||
| 		public void setTraverseMap(Map<String, Object> traverseMap, Map<String, Object> context) { | ||||
| 			this.data = traverseMap; | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public int size() { | ||||
| 			return this.data.size(); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public boolean isEmpty() { | ||||
| 			return this.data.isEmpty(); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public boolean containsKey(Object key) { | ||||
| 			return this.data.containsKey(key); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public boolean containsValue(Object value) { | ||||
| 			return this.data.containsValue(value); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public Object get(Object key) { | ||||
| 			return this.data.get(key); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public Object put(String key, Object value) { | ||||
| 			return this.data.put(key, value); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public Object remove(Object key) { | ||||
| 			return this.data.remove(key); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public void putAll(Map<? extends String, ? extends Object> m) { | ||||
| 			this.data.putAll(m); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public void clear() { | ||||
| 			this.data.clear(); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public Set<String> keySet() { | ||||
| 			return this.data.keySet(); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public Collection<Object> values() { | ||||
| 			return this.data.values(); | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public Set<Entry<String, Object>> entrySet() { | ||||
| 			return this.data.entrySet(); | ||||
| 		}; | ||||
| 		 | ||||
| 		JsonElement je = (new JsonParser()).parse(metadata); | ||||
| 		JsonObject root = je.getAsJsonObject();		 | ||||
| 		return root; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime</groupId> | ||||
|         <artifactId>base</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|  | ||||
|   | ||||
							
								
								
									
										201
									
								
								platform/runtime/base/config-extensions/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								platform/runtime/base/config-extensions/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										37
									
								
								platform/runtime/base/config-extensions/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								platform/runtime/base/config-extensions/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.platform.runtime</groupId> | ||||
|     <artifactId>base</artifactId> | ||||
|     <version>1.8.2</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
|   <artifactId>config-extensions</artifactId> | ||||
|   <packaging>bundle</packaging> | ||||
|   <name>ENTAXY :: PLATFORM :: BASE :: CONFIG EXTENSIONS</name> | ||||
|   <description>ENTAXY :: PLATFORM :: BASE :: CONFIG EXTENSIONS</description> | ||||
|    | ||||
|   <properties> | ||||
|   	<bundle.osgi.export.pkg>ru.entaxy.platform.base.config</bundle.osgi.export.pkg> | ||||
|   </properties> | ||||
|    | ||||
|   <dependencies> | ||||
|   	<dependency> | ||||
|   		<groupId>org.apache.karaf.config</groupId> | ||||
|   		<artifactId>org.apache.karaf.config.core</artifactId> | ||||
|   		<version>${karaf.version}</version> | ||||
|   	</dependency> | ||||
|   	<dependency> | ||||
|   		<groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
|   		<artifactId>base-support</artifactId> | ||||
|   		<version>${project.version}</version> | ||||
|   	</dependency> | ||||
|   	<dependency> | ||||
|   		<groupId>org.apache.felix</groupId> | ||||
|   		<artifactId>org.apache.felix.configadmin</artifactId> | ||||
|   		<version>${felix.configadmin.version}</version> | ||||
|   		 | ||||
|   	</dependency> | ||||
|   </dependencies>   | ||||
|    | ||||
| </project> | ||||
| @@ -0,0 +1,105 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * config-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.config; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.util.Dictionary; | ||||
| import java.util.Enumeration; | ||||
| import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | ||||
|  | ||||
| import org.osgi.framework.ServiceReference; | ||||
| import org.osgi.service.cm.Configuration; | ||||
| import org.osgi.service.cm.ConfigurationAdmin; | ||||
| import org.osgi.service.cm.ConfigurationPlugin; | ||||
| import org.osgi.service.component.annotations.Component; | ||||
| import org.osgi.service.component.annotations.Reference; | ||||
| import org.osgi.service.component.annotations.ReferenceCardinality; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| /** | ||||
|  *  | ||||
|  * Configuration plugin providing resolving references from one config to others | ||||
|  * in a form $PID_OF_OTHER_CONFIG{PROPERTY_NAME} | ||||
|  * e.g. $org.ops4j.pax.url.mvn{org.ops4j.pax.url.mvn.localRepository} | ||||
|  *  | ||||
|  * If pid or property not found no changes are made | ||||
|  *  | ||||
|  * @author sstarovoytenkov | ||||
|  * | ||||
|  */ | ||||
| @Component(service = {ConfigurationPlugin.class}, immediate = true,  | ||||
| 	property = {ConfigurationPlugin.CM_TARGET + "=*" | ||||
| 			, ConfigurationPlugin.CM_RANKING + "=100" | ||||
| 			, "config.plugin.id=ConfigLookupConfigurationPlugin"}) | ||||
| public class ConfigLookupConfigurationPlugin implements ConfigurationPlugin { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(ConfigLookupConfigurationPlugin.class); | ||||
| 	 | ||||
| 	@Reference(cardinality = ReferenceCardinality.MANDATORY) | ||||
| 	protected ConfigurationAdmin configurationAdmin; | ||||
| 	 | ||||
| 	@Override | ||||
| 	public void modifyConfiguration(ServiceReference<?> arg0, Dictionary<String, Object> properties) { | ||||
| 		for (Enumeration<String> keys = properties.keys(); keys.hasMoreElements(); ) { | ||||
| 			String key = keys.nextElement(); | ||||
| 			Object val = properties.get(key); | ||||
| 			if (val instanceof String) { | ||||
| 				 | ||||
| 				String text = (String)val; | ||||
| 				String newValue = (String)val; | ||||
| 				Pattern pattern = Pattern.compile("\\$([^\\{\\}])+\\{.+?\\}"); | ||||
| 				Matcher matcher = pattern.matcher(text); | ||||
| 				while (matcher.find()) { | ||||
| 			    	log.debug("FOUND :: " + text.substring(matcher.start(), matcher.end())); | ||||
| 		    		String placeholder = text.substring(matcher.start(), matcher.end()); | ||||
| 		    		String pid = placeholder.substring(1, placeholder.indexOf("{")); | ||||
| 		    		String propName = placeholder.substring(placeholder.indexOf("{")+1 | ||||
| 			        		, placeholder.indexOf("}")); | ||||
| 		    		log.debug("PARSED :: " + pid + ":" + propName); | ||||
| 					Configuration conf; | ||||
| 					try { | ||||
| 						conf = configurationAdmin.getConfiguration(pid); | ||||
| 						if (conf != null) { | ||||
| 							 | ||||
| 							Dictionary<String, Object> props = conf.getProperties(); | ||||
| 							Object value = props.get(propName); | ||||
| 							log.debug("VALUE :: " + placeholder + " = " + value); | ||||
| 							if (value != null) { | ||||
| 								newValue = newValue.replace(placeholder, (String)value); | ||||
| 								log.debug("NEW VALUE :: " + placeholder + " = " + newValue); | ||||
| 							} | ||||
| 								 | ||||
| 							 | ||||
| 						} | ||||
| 					} catch (IOException e) { | ||||
| 						log.error("Error with pid: " + pid, e); | ||||
| 					} | ||||
| 					 | ||||
| 				} | ||||
| 				 | ||||
| 				properties.put(key, newValue); | ||||
|  | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,232 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * configuration-test-1 | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.config; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | ||||
| import java.util.Collection; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
|  | ||||
| import org.apache.felix.utils.properties.TypedProperties; | ||||
| import org.apache.karaf.config.core.ConfigRepository; | ||||
| import org.osgi.framework.BundleContext; | ||||
| import org.osgi.framework.Constants; | ||||
| import org.osgi.framework.InvalidSyntaxException; | ||||
| import org.osgi.framework.ServiceReference; | ||||
| import org.osgi.service.cm.ConfigurationAdmin; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import ru.entaxy.platform.base.support.CommonUtils; | ||||
|  | ||||
| public class DefaultPropertiesProvider implements Map<String, Object> { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(DefaultPropertiesProvider.class); | ||||
| 	 | ||||
| 	protected String objectId; | ||||
| 	 | ||||
| 	protected String objectType; | ||||
| 	 | ||||
|  | ||||
| 	protected String configurationPid; | ||||
| 	protected BundleContext bundleContext; | ||||
| 	protected Map<String, Object> properties; | ||||
|  | ||||
| 	public DefaultPropertiesProvider(String configurationPid | ||||
| 			, BundleContext bundleContext | ||||
| 			, Map<String, Object> properties) { | ||||
| 		 | ||||
| 		this.configurationPid = configurationPid; | ||||
| 		this.bundleContext = bundleContext; | ||||
| 		this.properties = properties; | ||||
| 		register(); | ||||
| 	} | ||||
| 	 | ||||
| 	public DefaultPropertiesProvider(String objectId | ||||
| 			, String objectType | ||||
| 			, String configurationPid | ||||
| 			, BundleContext bundleContext | ||||
| 			, Map<String, Object> properties) { | ||||
| 		 | ||||
| 		this.objectId = objectId; | ||||
| 		this.objectType = objectType; | ||||
| 		 | ||||
| 		this.configurationPid = configurationPid; | ||||
| 		this.bundleContext = bundleContext; | ||||
| 		this.properties = properties; | ||||
| 		register(); | ||||
| 	} | ||||
|  | ||||
| 	protected void register() { | ||||
| 		if (!CommonUtils.isValid(objectId) || !CommonUtils.isValid(objectType)) | ||||
| 			return; | ||||
| 		try { | ||||
| 			String fileName = System.getProperty("karaf.etc"); | ||||
| 			Path path = Paths.get(fileName).resolve(objectType).resolve(configurationPid + ".cfg"); | ||||
|  | ||||
| 			File f = new File(path.toUri()); | ||||
| /* | ||||
| 			if ((this.configurationPid != null) && (this.bundleContext != null)) { | ||||
| 				 | ||||
| 				ServiceReference<CustomConfigLocationCollector> collectorRef =  | ||||
| 						this.bundleContext.getServiceReference(CustomConfigLocationCollector.class); | ||||
| 				if (collectorRef != null) { | ||||
| 					CustomConfigLocationCollector collector = this.bundleContext.getService(collectorRef); | ||||
| 					if (collector != null) | ||||
| 						collector.addCustomLocation(configurationPid, "file:/" + f.getAbsolutePath().replace("\\", "/")); | ||||
| 					else | ||||
| 						log.error("registerImmutables :: COLLECTOR IS NULL"); | ||||
| 					this.bundleContext.ungetService(collectorRef); | ||||
| 				} else { | ||||
| 					log.error("registerImmutables :: REF IS NULL"); | ||||
| 				} | ||||
| 			} | ||||
| */			 | ||||
| 			 | ||||
| 			if (!f.exists()) { | ||||
| 				f.getParentFile().mkdirs(); | ||||
| 				f.createNewFile(); | ||||
| 			} else { | ||||
| 				// we're not updating existing files | ||||
| 				return; | ||||
| 			} | ||||
| 			 | ||||
| 			ServiceReference<ConfigRepository> refCR = bundleContext.getServiceReference(ConfigRepository.class); | ||||
| 			if (refCR == null) | ||||
| 				return; | ||||
| 			ConfigRepository repo = bundleContext.getService(refCR); | ||||
|  | ||||
| 			TypedProperties typedProperties; | ||||
| 			 | ||||
| /*			ServiceReference<ConfigurationAdmin> refCA = bundleContext.getServiceReference(ConfigurationAdmin.class); | ||||
| 			if (refCA == null) | ||||
| 				return; | ||||
| 			ConfigurationAdmin configAdmin = bundleContext.getService(refCA); | ||||
| 			Configuration config = configAdmin.getConfiguration(configurationPid); | ||||
| 			Dictionary<String, Object> props = config.getProperties(); | ||||
| 			Iterator<String> iter = props.keys().asIterator();  | ||||
| 			System.out.println("PROPS :: "); | ||||
| 			while(iter.hasNext()) { | ||||
| 				String key = iter.next(); | ||||
| 				System.out.println(key + "-->" + props.get(key) + ":" + props.get(key).getClass().getName()); | ||||
| 			} | ||||
| 			 | ||||
| 			props.put("felix.fileinstall.filename", "file:/" + f.getAbsolutePath().replace("\\", "/")); | ||||
| 			config.update(props); | ||||
| 			 | ||||
| 			TypedProperties typedProperties = repo.getConfig(configurationPid); | ||||
|  | ||||
| 			System.out.println("TYPED PROPS 0:: "); | ||||
| 			for (Entry<String, Object> entry: typedProperties.entrySet()) | ||||
| 				System.out.println(entry.getKey() + "-->" + entry.getValue() + ":" + entry.getValue().getClass().getName()); | ||||
| */ | ||||
| 			typedProperties = repo.getConfig(configurationPid); | ||||
| 			 | ||||
| 			 | ||||
| 			typedProperties.putAll(properties); | ||||
| 			typedProperties.remove( Constants.SERVICE_PID ); | ||||
| 			typedProperties.remove( ConfigurationAdmin.SERVICE_FACTORYPID ); | ||||
| 			typedProperties.remove( "felix.fileinstall.filename" ); | ||||
| 			 | ||||
| 			typedProperties.save(f); | ||||
|  | ||||
| //			typedProperties = repo.getConfig(configurationPid); | ||||
| //			typedProperties.put("felix.fileinstall.filename", "file:/" + f.getAbsolutePath().replace("\\", "/")); | ||||
| 			 | ||||
| /*			repo.update(configurationPid, typedProperties); | ||||
|  | ||||
| 			typedProperties = repo.getConfig(configurationPid); | ||||
|  | ||||
| 			System.out.println("TYPED PROPS 2:: "); | ||||
| 			for (Entry<String, Object> entry: typedProperties.entrySet()) | ||||
| 				System.out.println(entry.getKey() + "-->" + entry.getValue() + ":" + entry.getValue().getClass().getName()); | ||||
| */			 | ||||
| 			bundleContext.ungetService(refCR); | ||||
| 			 | ||||
| 		} catch (IOException | InvalidSyntaxException  e) { | ||||
| 			log.error("Error registering default properties for " + configurationPid + "\n", e); | ||||
| 		} | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public int size() { | ||||
| 		return properties.size(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean isEmpty() { | ||||
| 		return properties.isEmpty(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean containsKey(Object key) { | ||||
| 		return properties.containsKey(key); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean containsValue(Object value) { | ||||
| 		return properties.containsValue(value); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Object get(Object key) { | ||||
| 		return properties.get(key); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Object put(String key, Object value) { | ||||
| 		return properties.put(key, value); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Object remove(Object key) { | ||||
| 		return properties.remove(key); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void putAll(Map<? extends String, ? extends Object> m) { | ||||
| 		properties.putAll(m); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void clear() { | ||||
| 		properties.clear(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Set<String> keySet() { | ||||
| 		return properties.keySet(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<Object> values() { | ||||
| 		return properties.values(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Set<Entry<String, Object>> entrySet() { | ||||
| 		return properties.entrySet(); | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,97 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * configuration-test-1 | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.config; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| import org.osgi.framework.BundleContext; | ||||
| import org.osgi.framework.ServiceReference; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| public class DefaultPropertiesProviderWithImmutables extends DefaultPropertiesProvider implements Immutables { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(DefaultPropertiesProviderWithImmutables.class); | ||||
| 	 | ||||
| 	protected Map<String, Object> immutables; | ||||
| 	 | ||||
| 	public DefaultPropertiesProviderWithImmutables(String objectId | ||||
| 			, String objectType | ||||
| 			, String configurationPid | ||||
| 			, BundleContext bundleContext | ||||
| 			, Map<String, Object> configurables) { | ||||
| 		super(objectId, objectType, configurationPid, bundleContext, configurables); | ||||
| 	} | ||||
|  | ||||
| 	public DefaultPropertiesProviderWithImmutables(String configurationPid | ||||
| 			, BundleContext bundleContext | ||||
| 			, Map<String, Object> configurables) { | ||||
| 		super(configurationPid, bundleContext, configurables); | ||||
| 	} | ||||
|  | ||||
| 	public DefaultPropertiesProviderWithImmutables(String configurationPid | ||||
| 			, BundleContext bundleContext | ||||
| 			, Map<String, Object> configurables | ||||
| 			, Map<String, Object> immutables) { | ||||
| 		super(configurationPid, bundleContext, configurables); | ||||
| 		this.immutables = immutables; | ||||
| 		registerImmutables(); | ||||
| 	} | ||||
|  | ||||
| 	public DefaultPropertiesProviderWithImmutables(String objectId | ||||
| 			, String objectType | ||||
| 			, String configurationPid | ||||
| 			, BundleContext bundleContext | ||||
| 			, Map<String, Object> configurables | ||||
| 			, Map<String, Object> immutables) { | ||||
| 		super(objectId, objectType, configurationPid, bundleContext, configurables); | ||||
| 		this.immutables = immutables; | ||||
| 		registerImmutables(); | ||||
| 	} | ||||
| 	 | ||||
| 	protected void registerImmutables() { | ||||
| 		if ((this.configurationPid != null) && (this.bundleContext != null)) { | ||||
| 			 | ||||
| 			ServiceReference<ImmutablesCollector> collectorRef = this.bundleContext.getServiceReference(ImmutablesCollector.class); | ||||
| 			if (collectorRef != null) { | ||||
| 				ImmutablesCollector collector = this.bundleContext.getService(collectorRef); | ||||
| 				if (collector != null) | ||||
| 					collector.add(this); | ||||
| 				else | ||||
| 					log.error("registerImmutables :: COLLECTOR IS NULL"); | ||||
| 				this.bundleContext.ungetService(collectorRef); | ||||
| 			} else { | ||||
| 				log.error("registerImmutables :: REF IS NULL"); | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getPid() { | ||||
| 		return this.configurationPid; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Map<String, Object> getProperties() { | ||||
| 		return this.immutables; | ||||
| 	}; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,29 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * configuration-test-1 | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.config; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| public interface Immutables { | ||||
|  | ||||
| 	String getPid(); | ||||
| 	Map<String, Object> getProperties(); | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,26 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * configuration-test-1 | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.config; | ||||
|  | ||||
| public interface ImmutablesCollector { | ||||
|  | ||||
| 	void add(Immutables immutables); | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,117 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * configuration-test-1 | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.config; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.util.Dictionary; | ||||
| import java.util.HashMap; | ||||
| import java.util.Hashtable; | ||||
| import java.util.Iterator; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
|  | ||||
| import org.osgi.framework.BundleContext; | ||||
| import org.osgi.framework.Constants; | ||||
| import org.osgi.framework.ServiceReference; | ||||
| import org.osgi.service.cm.ConfigurationAdmin; | ||||
| import org.osgi.service.cm.ConfigurationPlugin; | ||||
| import org.osgi.service.component.ComponentContext; | ||||
| import org.osgi.service.component.annotations.Component; | ||||
| import org.osgi.service.component.annotations.Reference; | ||||
| import org.osgi.service.component.annotations.ReferenceCardinality; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| @Component(service = {ConfigurationPlugin.class, ImmutablesCollector.class}, immediate = true,  | ||||
| 	property = {ConfigurationPlugin.CM_TARGET + "=*" | ||||
| 			, ConfigurationPlugin.CM_RANKING + "=100" | ||||
| 			, "config.plugin.id=ImmutablesConfigurationPlugin"}) | ||||
| public class ImmutablesConfigurationPlugin implements ConfigurationPlugin, ImmutablesCollector { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(ImmutablesConfigurationPlugin.class); | ||||
| 	 | ||||
| 	protected BundleContext bundleContext; | ||||
| 	 | ||||
| 	protected Map<String, Immutables> immutablesMap = new HashMap<>(); | ||||
| 	 | ||||
| 	protected Map<String, Dictionary<String, Object>> immutablesDataMap = new HashMap<>(); | ||||
| 	 | ||||
| 	@Reference(cardinality = ReferenceCardinality.MANDATORY) | ||||
| 	ConfigurationAdmin configurationAdmin; | ||||
| 	 | ||||
| 	public void activate(ComponentContext componentContext) { | ||||
| 		this.bundleContext = componentContext.getBundleContext(); | ||||
| 		log.debug("ImmutablesConfigurationPlugin activated"); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public void modifyConfiguration(ServiceReference<?> reference, Dictionary<String, Object> properties) { | ||||
| 		String pid = properties.get(Constants.SERVICE_PID).toString(); | ||||
| 		if (immutablesDataMap.containsKey(pid)) { | ||||
| 			Dictionary<String, Object> ims = immutablesDataMap.get(pid); | ||||
| 			Iterator<String> iter = ims.keys().asIterator(); | ||||
| 			while (iter.hasNext()) { | ||||
| 				String key = iter.next(); | ||||
| 				properties.put(key, ims.get(key)); | ||||
| 			} | ||||
| 			log.debug("DATA: " + pid + " FOUND"); | ||||
| 		} else { | ||||
| 			log.debug("DATA: " + pid + " NOT FOUND"); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void add(Immutables immutables) { | ||||
| 		synchronized (immutablesDataMap) { | ||||
| 			boolean reload = true; | ||||
| 			if (immutablesDataMap.containsKey(immutables.getPid())) { | ||||
| 				Dictionary<String, Object> current = immutablesDataMap.get(immutables.getPid()); | ||||
| 				reload = !immutables.getProperties().entrySet().stream() | ||||
| 					.allMatch(e -> e.getValue().equals(current.get(e.getKey()))); | ||||
| 			} | ||||
| 			if (!reload) { | ||||
| 				log.debug("Immutables for " + immutables.getPid() + " already loaded"); | ||||
| 				return; | ||||
| 			} | ||||
| 			immutablesDataMap.remove(immutables.getPid()); | ||||
| 			log.debug("Adding direct Immutables for " + immutables.getPid()); | ||||
| 			Dictionary<String, Object> ims = new Hashtable<>(); | ||||
| 			Map<String, Object> properties = immutables.getProperties(); | ||||
| 			if (properties != null) | ||||
| 				for (Entry<String, Object> entry: properties.entrySet()) | ||||
| 					ims.put(entry.getKey(), entry.getValue()); | ||||
| 			immutablesDataMap.put(immutables.getPid(), ims); | ||||
| 			try { | ||||
| 				Dictionary<String, Object> props = configurationAdmin.getConfiguration(immutables.getPid()).getProperties(); | ||||
| 				if (props == null) | ||||
| 					props = new Hashtable<>(); | ||||
| 				Iterator<String> keys = ims.keys().asIterator(); | ||||
| 				while (keys.hasNext()) { | ||||
| 					String key = keys.next(); | ||||
| 					props.put(key, ims.get(key)); | ||||
| 				} | ||||
| 				configurationAdmin.getConfiguration(immutables.getPid()).setBundleLocation("?"); | ||||
| 				configurationAdmin.getConfiguration(immutables.getPid()).update(props); | ||||
| 			} catch (IOException e) { | ||||
| 				log.error("Failed updateing configuration", e); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,99 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * configuration-test-1 | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.config; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| import org.osgi.framework.BundleContext; | ||||
| import org.osgi.framework.ServiceReference; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| public class ImmutablesImpl implements Immutables { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(ImmutablesImpl.class); | ||||
| 	 | ||||
| 	protected BundleContext bundleContext; | ||||
| 	 | ||||
| 	protected String pid; | ||||
| 	protected Map<String, Object> properties; | ||||
| 	 | ||||
| 	public ImmutablesImpl() { | ||||
| 		super(); | ||||
| 	} | ||||
|  | ||||
| 	public ImmutablesImpl(String pid, BundleContext bundleContext) { | ||||
| 		super(); | ||||
| 		setPid(pid); | ||||
| 		setBundleContext(bundleContext); | ||||
| 	} | ||||
|  | ||||
| 	public ImmutablesImpl(String pid, BundleContext bundleContext, Map<String, Object> properties) { | ||||
| 		super(); | ||||
| 		setProperties(properties); | ||||
| 		setPid(pid); | ||||
| 		setBundleContext(bundleContext); | ||||
| 	} | ||||
| 	 | ||||
| 	public void setPid(String pid) { | ||||
| 		this.pid = pid; | ||||
| 		checkAndRegister(); | ||||
| 	} | ||||
|  | ||||
| 	public void setProperties(Map<String, Object> properties) { | ||||
| 		this.properties = properties; | ||||
| 	} | ||||
|  | ||||
| 	public void setBundleContext(BundleContext bundleContext) { | ||||
| 		this.bundleContext = bundleContext; | ||||
| 		checkAndRegister(); | ||||
| 	} | ||||
|  | ||||
| 	protected void checkAndRegister() { | ||||
| 		if ((this.pid != null) && (this.bundleContext != null)) { | ||||
| 			 | ||||
| 			log.debug("\n\tcheckAndRegister :: START"); | ||||
| 			 | ||||
| 			ServiceReference<ImmutablesCollector> collectorRef = this.bundleContext.getServiceReference(ImmutablesCollector.class); | ||||
| 			if (collectorRef != null) { | ||||
| 				log.debug("\n\tcheckAndRegister :: GET COLLECTOR"); | ||||
| 				ImmutablesCollector collector = this.bundleContext.getService(collectorRef); | ||||
| 				if (collector != null) | ||||
| 					collector.add(this); | ||||
| 				else | ||||
| 					log.debug("\n\tcheckAndRegister :: COLLECTOR IS NULL"); | ||||
| 				this.bundleContext.ungetService(collectorRef); | ||||
| 			} else { | ||||
| 				log.debug("\n\tcheckAndRegister :: REF IS NULL"); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public String getPid() { | ||||
| 		return this.pid; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Map<String, Object> getProperties() { | ||||
| 		return this.properties; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>adapter</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -19,7 +19,9 @@ | ||||
|  */ | ||||
| package ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.management; | ||||
|  | ||||
| public interface AdapterMBean { | ||||
| import ru.entaxy.esb.platform.base.management.core.api.RuntimeTypedMBean; | ||||
|  | ||||
| public interface AdapterMBean extends RuntimeTypedMBean { | ||||
|  | ||||
| 	public boolean isInited(); | ||||
| 	 | ||||
|   | ||||
| @@ -22,8 +22,11 @@ package ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.management; | ||||
| import javax.management.NotCompliantMBeanException; | ||||
| import javax.management.StandardMBean; | ||||
|  | ||||
| import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped; | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.api.Adapter; | ||||
|  | ||||
| //@TODO move string to constant | ||||
| @EntaxyRuntimeTyped(name = "entaxy.runtime.adapter") | ||||
| public class AdapterMBeanImpl extends StandardMBean implements AdapterMBean { | ||||
| 	 | ||||
| 	protected Adapter adapter; | ||||
|   | ||||
| @@ -24,9 +24,9 @@ import ru.entaxy.esb.platform.base.management.core.Qualifier; | ||||
|  | ||||
| public interface AdaptersMBean { | ||||
| 	 | ||||
| 	public static final String ADAPTERS_KEY = "categrory"; | ||||
| 	public static final String ADAPTERS_KEY = "category"; | ||||
| 	 | ||||
| 	public static final String ADAPTERS_VALUE = "adapters"; | ||||
| 	public static final String ADAPTERS_VALUE = "adapter"; | ||||
| 	 | ||||
| 	public static final Qualifier Q_ADAPTERS = ManagementCore.Q_PLATFORM.qualifier(ADAPTERS_KEY, ADAPTERS_VALUE); | ||||
| 	 | ||||
|   | ||||
| @@ -67,7 +67,7 @@ public class AdaptersMBeanImpl extends StandardMBean implements AdaptersMBean { | ||||
| 	 | ||||
| 	@Activate | ||||
| 	public void activate(ComponentContext componentContext) { | ||||
| 		log.info(" >> ACTIVATE <<"); | ||||
| 		log.debug(" >> ACTIVATE <<"); | ||||
| 		this.bundleContext = componentContext.getBundleContext(); | ||||
| 	} | ||||
| 	 | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>adapter</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -55,7 +55,7 @@ | ||||
| 				"type": "pathParameter", | ||||
| 				"generator": "", | ||||
| 				"config": { | ||||
| 					"expession": "${destinationType}:${destinationName}" | ||||
| 					"expression": "${destinationType}:${destinationName}" | ||||
| 				} | ||||
| 			}, | ||||
| 			{ | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>adapter</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -665,7 +665,7 @@ | ||||
| 				"type": "pathParameter", | ||||
| 				"generator": "", | ||||
| 				"config": { | ||||
| 					"expession": "${destinationType}:${destinationName}" | ||||
| 					"expression": "${destinationType}:${destinationName}" | ||||
| 				} | ||||
| 			}, | ||||
| 			{ | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>adapter</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -55,7 +55,7 @@ | ||||
| 				"type": "pathParameter", | ||||
| 				"generator": "", | ||||
| 				"config": { | ||||
| 					"expession": "${destinationType}:${destinationName}" | ||||
| 					"expression": "${destinationType}:${destinationName}" | ||||
| 				} | ||||
| 			}, | ||||
| 			{ | ||||
|   | ||||
| @@ -1,11 +1,10 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | ||||
|  | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>adapter</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
| @@ -19,6 +18,9 @@ | ||||
|  | ||||
|     <properties> | ||||
|         <bundle.osgi.dynamicimport.pkg>*</bundle.osgi.dynamicimport.pkg> | ||||
|         <bundle.osgi.export.pkg>ru.entaxy.platform.adapter.file</bundle.osgi.export.pkg> | ||||
|         <bundle.osgi.private.pkg>template, | ||||
|         	ru.entaxy.adapter</bundle.osgi.private.pkg> | ||||
| <!--        <bundle.osgi.private.pkg>ru.entaxy.adapter</bundle.osgi.private.pkg>--> | ||||
|     </properties> | ||||
|  | ||||
| @@ -30,11 +32,30 @@ | ||||
|                 <extensions>true</extensions> | ||||
|                 <configuration> | ||||
|                     <instructions> | ||||
|                         <Entaxy-Adapter>true</Entaxy-Adapter> | ||||
|                         <Entaxy-Adapter-Class/> | ||||
|                         <!-- Entaxy-Adapter>true</Entaxy-Adapter> | ||||
|                         <Entaxy-Adapter-Class / --> | ||||
| 						<Entaxy-Factory-Provider>true</Entaxy-Factory-Provider>	 | ||||
| 						<Entaxy-Template-Provider>true</Entaxy-Template-Provider> | ||||
|                     </instructions> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|         </plugins> | ||||
|     </build> | ||||
| </project> | ||||
|     <dependencies> | ||||
|     	<dependency> | ||||
|     		<groupId>org.apache.camel</groupId> | ||||
|     		<artifactId>camel-file</artifactId> | ||||
|     		<version>${camel.version}</version> | ||||
|     	</dependency> | ||||
|     	<dependency> | ||||
|     		<groupId>org.apache.camel</groupId> | ||||
|     		<artifactId>camel-util</artifactId> | ||||
|     		<version>${camel.version}</version> | ||||
|     	</dependency> | ||||
| 	  	<dependency> | ||||
| 	  		<groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
| 	  		<artifactId>base-support</artifactId> | ||||
| 	  		<version>${project.version}</version> | ||||
| 	  	</dependency> | ||||
|     </dependencies> | ||||
| </project> | ||||
|   | ||||
| @@ -0,0 +1,69 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * file-adapter | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.adapter.file; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.Map; | ||||
|  | ||||
| import org.apache.camel.component.file.FileComponent; | ||||
| import org.apache.camel.component.file.GenericFileEndpoint; | ||||
| import org.apache.camel.util.StringHelper; | ||||
|  | ||||
| import ru.entaxy.platform.base.support.CommonUtils; | ||||
|  | ||||
| public class ExtendedFileComponent extends FileComponent { | ||||
|  | ||||
| 	protected String rootDirectory = ""; | ||||
|  | ||||
| 	@Override | ||||
| 	protected GenericFileEndpoint<File> buildFileEndpoint(String uri, String remaining, Map<String, Object> parameters) | ||||
| 			throws Exception { | ||||
| 		 | ||||
| 		// copied from parent  | ||||
|         if (StringHelper.hasStartToken(remaining, "simple")) { | ||||
|             throw new IllegalArgumentException("Invalid directory: " + remaining + ". Dynamic expressions with ${ } placeholders is not allowed." | ||||
|                                                + " Use the fileName option to set the dynamic expression."); | ||||
|         } | ||||
| 		 | ||||
| 		String current = remaining; | ||||
| 		if (CommonUtils.isValid(rootDirectory)) { | ||||
| 			current = rootDirectory; | ||||
| 			if (CommonUtils.isValid(remaining) && !".".equals(remaining)) { | ||||
| 				if (!current.endsWith("/")) | ||||
| 					current += "/"; | ||||
| 				if (remaining.startsWith("/")) | ||||
| 					current += remaining.substring(1); | ||||
| 				else | ||||
| 					current += remaining; | ||||
| 			} | ||||
| 		} | ||||
| 		log.debug("CREATING ENDPOINT FOR [{}]", current); | ||||
| 		return super.buildFileEndpoint(uri, current, parameters); | ||||
| 	} | ||||
| 	 | ||||
| 	public String getRootDirectory() { | ||||
| 		return rootDirectory; | ||||
| 	} | ||||
|  | ||||
| 	public void setRootDirectory(String rootDirectory) { | ||||
| 		this.rootDirectory = rootDirectory; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -516,7 +516,7 @@ | ||||
| 				"type": "pathParameter", | ||||
| 				"generator": "", | ||||
| 				"config": { | ||||
| 					"expession": "${directoryName}" | ||||
| 					"expression": "${directoryName}" | ||||
| 				} | ||||
| 			}, | ||||
| 			{ | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,47 @@ | ||||
| [#ftl attributes={"generated.type":"blueprint"}] | ||||
| [#-- | ||||
|  | ||||
|     ~~~~~~licensing~~~~~~ | ||||
|     file-adapter | ||||
|     ========== | ||||
|     Copyright (C) 2020 - 2021 EmDev LLC | ||||
|     ========== | ||||
|     Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|     you may not use this file except in compliance with the License. | ||||
|     You may obtain a copy of the License at | ||||
|  | ||||
|          http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|     Unless required by applicable law or agreed to in writing, software | ||||
|     distributed under the License is distributed on an "AS IS" BASIS, | ||||
|     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|     See the License for the specific language governing permissions and | ||||
|     limitations under the License. | ||||
|     ~~~~~~/licensing~~~~~~ | ||||
|  | ||||
| --] | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" | ||||
|            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|            xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" | ||||
|            xsi:schemaLocation=" | ||||
|                http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd" | ||||
|            > | ||||
|  | ||||
|     <service interface="org.apache.camel.Component" ref="[=objectId]"> | ||||
|         <service-properties> | ||||
|             <entry key="connection.name" value="[=objectId]"/> | ||||
|         </service-properties> | ||||
|     </service> | ||||
|  | ||||
|     <bean id="[=objectId]" class="ru.entaxy.platform.adapter.file.ExtendedFileComponent"> | ||||
|         [#if properties??] | ||||
|         	[#list properties as key, value] | ||||
|         		[#if !key?starts_with("##") && !key?starts_with("__")] [#-- we skip additional properties --] | ||||
|         <property name="[=key]" value="[=value]"/> | ||||
|         		[/#if] | ||||
|         	[/#list] | ||||
|         [/#if] | ||||
|     </bean> | ||||
|  | ||||
| </blueprint> | ||||
| @@ -45,7 +45,7 @@ | ||||
|         </service-properties> | ||||
|     </service> | ||||
|  | ||||
|     <bean id="[=connection.name]" class="org.apache.camel.component.file.FileComponent"> | ||||
|     <bean id="[=connection.name]" class="ru.entaxy.platform.adapter.file.ExtendedFileComponent"> | ||||
|         [#if connection.properties??] | ||||
|         [#list connection.properties as key, value] | ||||
|         <property name="[=key]" value="[='$']{[=connection.configurationPid].[=key]}"/> | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>adapter</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -110,7 +110,7 @@ | ||||
| 				"type": "pathParameter", | ||||
| 				"generator": "", | ||||
| 				"config": { | ||||
| 					"expession": "${dataSourceName}" | ||||
| 					"expression": "${dataSourceName}" | ||||
| 				} | ||||
| 			}, | ||||
| 			{ | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>adapter</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -665,7 +665,7 @@ | ||||
| 				"type": "pathParameter", | ||||
| 				"generator": "", | ||||
| 				"config": { | ||||
| 					"expession": "${destinationType}:${destinationName}" | ||||
| 					"expression": "${destinationType}:${destinationName}" | ||||
| 				} | ||||
| 			}, | ||||
| 			{ | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
|         <artifactId>connecting</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>adapter</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -110,7 +110,7 @@ | ||||
| 				"type": "pathParameter", | ||||
| 				"generator": "", | ||||
| 				"config": { | ||||
| 					"expession": "${dataSourceName}" | ||||
| 					"expression": "${dataSourceName}" | ||||
| 				} | ||||
| 			}, | ||||
| 			{ | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>adapter</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -55,7 +55,7 @@ | ||||
| 				"type": "pathParameter", | ||||
| 				"generator": "", | ||||
| 				"config": { | ||||
| 					"expession": "${destinationType}:${destinationName}" | ||||
| 					"expression": "${destinationType}:${destinationName}" | ||||
| 				} | ||||
| 			}, | ||||
| 			{ | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
|         <artifactId>connecting</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|     <artifactId>generator</artifactId> | ||||
|     <version>1.8.1</version> | ||||
|     <version>1.8.2</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.platform.runtime.base.connecting.generator</groupId> | ||||
|   <artifactId>common-templates-collection</artifactId> | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>generator</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
| @@ -20,7 +20,6 @@ | ||||
|         <bundle.osgi.export.pkg> | ||||
|             ru.entaxy.esb.platform.runtime.base.connecting.generator.ftl | ||||
|         </bundle.osgi.export.pkg> | ||||
|         <freemarker.version>2.3.29</freemarker.version> | ||||
|     </properties> | ||||
|  | ||||
|     <dependencies> | ||||
|   | ||||
| @@ -105,6 +105,22 @@ public class FTLGenerator extends AbstractSelfPublishGenerator<FTLGenerator> | ||||
|     	return generateForTemplate(template, properties); | ||||
|     } | ||||
|     | ||||
|     @Override | ||||
|     public boolean isGeneratable(Map<String, Object> properties) throws Exception { | ||||
|     	prepareTemplate(properties); | ||||
|     	if (template == null) | ||||
|     		return false; | ||||
|     	URL templateURL = template.getTemplateLocation()==null | ||||
|     			?FrameworkUtil.getBundle(FTLGenerator.class).getEntry(DEFAULT_TEMPLATE_PATH) | ||||
|     			:template.getTemplateLocation(); | ||||
|     	try { | ||||
|     		Template temp = getTemplateByFullName(templateURL, template.getTemplateFullName()); | ||||
|     		return (temp != null); | ||||
|     	} catch (Exception e) { | ||||
|     		return false; | ||||
|     	} | ||||
|     } | ||||
|      | ||||
|     public Generated generateForTemplate(ru.entaxy.base.generator.template.Template template, | ||||
|     		Map<String, Object> properties) throws Exception { | ||||
|  | ||||
| @@ -194,19 +210,19 @@ public class FTLGenerator extends AbstractSelfPublishGenerator<FTLGenerator> | ||||
|     	if (this.template != null) | ||||
|     		return; | ||||
|     	 | ||||
|     	Map<String, Object> finalPropertes = new HashMap<>(); | ||||
|     	finalPropertes.putAll(initialProperties); | ||||
|     	finalPropertes.putAll(generationProperties); | ||||
|     	Map<String, Object> finalProperties = new HashMap<>(); | ||||
|     	finalProperties.putAll(initialProperties); | ||||
|     	finalProperties.putAll(generationProperties); | ||||
|     	 | ||||
|     	TemplateImpl temp = new TemplateImpl(); | ||||
|     	temp.setBundleContext( | ||||
|     			(BundleContext)finalPropertes.getOrDefault(Generator.PROP_TARGET_BUNDLE_CONTEXT | ||||
|     			(BundleContext)finalProperties.getOrDefault(Generator.PROP_TARGET_BUNDLE_CONTEXT | ||||
|     					, FrameworkUtil.getBundle(FTLGenerator.class).getBundleContext()) | ||||
|     		); | ||||
|     	temp.setTemplateName((String)finalPropertes.getOrDefault(PROP_TEMPLATE_NAME | ||||
|     			, (String)finalPropertes.getOrDefault(Generator.PROP_USAGE_TYPE | ||||
|     	temp.setTemplateName((String)finalProperties.getOrDefault(PROP_TEMPLATE_NAME | ||||
|     			, (String)finalProperties.getOrDefault(Generator.PROP_USAGE_TYPE | ||||
|     					, "root"))); | ||||
|     	temp.setPath((String)finalPropertes.getOrDefault(PROP_TEMPLATE_NAME | ||||
|     	temp.setPath((String)finalProperties.getOrDefault(PROP_TEMPLATE_NAME | ||||
|     			, DEFAULT_TEMPLATE_PATH) | ||||
|     		); | ||||
|     	 | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>generator</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -20,6 +20,7 @@ | ||||
| package ru.entaxy.base.generator.template; | ||||
|  | ||||
| import java.net.URL; | ||||
| import java.util.Map; | ||||
|  | ||||
| public interface Template { | ||||
| 	 | ||||
| @@ -29,5 +30,5 @@ public interface Template { | ||||
| 	public String getTemplateName(); | ||||
| 	public String getTemplateFileName(); | ||||
| 	public String getTemplateFullName(); | ||||
| 	 | ||||
| 	public Map<String, String> getAdditionalProperties(); | ||||
| } | ||||
|   | ||||
| @@ -21,6 +21,7 @@ package ru.entaxy.base.generator.template; | ||||
|  | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URL; | ||||
| import java.util.Map; | ||||
|  | ||||
| import org.osgi.framework.BundleContext; | ||||
| import org.slf4j.Logger; | ||||
| @@ -45,6 +46,8 @@ public class TemplateImpl implements Template { | ||||
| 	 | ||||
| 	protected String templateLocation; | ||||
| 	 | ||||
| 	protected Map<String, String> additionalProperties = null; | ||||
| 	 | ||||
| 	public void load(ProvidedTemplate providedTemplate) { | ||||
| 		id = providedTemplate.getId(); | ||||
| 		name = providedTemplate.getName(); | ||||
| @@ -55,6 +58,7 @@ public class TemplateImpl implements Template { | ||||
| 		if (!path.endsWith("/")) | ||||
| 			path += "/"; | ||||
| 		description = providedTemplate.getDescription(); | ||||
| 		additionalProperties = providedTemplate.getAdditionalProperties(); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| @@ -120,5 +124,13 @@ public class TemplateImpl implements Template { | ||||
| 	public void setBundleContext(BundleContext bundleContext) { | ||||
| 		this.bundleContext = bundleContext; | ||||
| 	} | ||||
|  | ||||
| 	public Map<String, String> getAdditionalProperties() { | ||||
| 		return additionalProperties; | ||||
| 	} | ||||
|  | ||||
| 	public void setAdditionalProperties(Map<String, String> additionalProperties) { | ||||
| 		this.additionalProperties = additionalProperties; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
|   | ||||
| @@ -25,6 +25,7 @@ public interface TemplateService { | ||||
|  | ||||
| 	public static final String TEMPLATE_PROVIDER_HEADER = "Entaxy-Template-Provider"; | ||||
| 	 | ||||
| 	public static final String PROP_PREFIX = "template."; | ||||
| 	public static final String PROP_ID = "template.id"; | ||||
| 	public static final String PROP_TYPE = "template.type"; | ||||
| 	public static final String PROP_NAME = "template.name"; | ||||
|   | ||||
| @@ -84,6 +84,11 @@ public class LegacyTemplateAdapter { | ||||
| 		public String getTemplateFullName() { | ||||
| 			return template.getTemplateFileName() + ".ftl"; | ||||
| 		} | ||||
|  | ||||
| 		@Override | ||||
| 		public Map<String, String> getAdditionalProperties() { | ||||
| 			return null; | ||||
| 		} | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
|   | ||||
| @@ -19,6 +19,8 @@ | ||||
|  */ | ||||
| package ru.entaxy.base.generator.template.impl; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| import org.osgi.framework.ServiceRegistration; | ||||
|  | ||||
| import ru.entaxy.base.generator.template.Template; | ||||
| @@ -32,6 +34,7 @@ public class ProvidedTemplate { | ||||
| 	protected String type; | ||||
| 	protected String path; | ||||
| 	protected String description; | ||||
| 	protected Map<String, String> additionalProperties = null; | ||||
| 	 | ||||
| 	public ServiceRegistration<Template> registration; | ||||
| 	 | ||||
| @@ -47,6 +50,7 @@ public class ProvidedTemplate { | ||||
| 		this.type = templateMetadata.getType(); | ||||
| 		this.path = templateMetadata.getPath(); | ||||
| 		this.description = templateMetadata.getDescription(); | ||||
| 		this.additionalProperties = templateMetadata.getAdditionalProperties(); | ||||
| 	} | ||||
|  | ||||
| 	public String getId() { | ||||
| @@ -104,6 +108,14 @@ public class ProvidedTemplate { | ||||
| 	public void setDescription(String description) { | ||||
| 		this.description = description; | ||||
| 	} | ||||
|  | ||||
| 	public Map<String, String> getAdditionalProperties() { | ||||
| 		return additionalProperties; | ||||
| 	} | ||||
|  | ||||
| 	public void setAdditionalProperties(Map<String, String> additionalProperties) { | ||||
| 		this.additionalProperties = additionalProperties; | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| } | ||||
|   | ||||
| @@ -24,9 +24,9 @@ import java.io.InputStreamReader; | ||||
| import java.net.URL; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.Dictionary; | ||||
| import java.util.Enumeration; | ||||
| import java.util.Hashtable; | ||||
| import java.util.Optional; | ||||
| import java.util.Properties; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import org.osgi.framework.Bundle; | ||||
| @@ -93,29 +93,77 @@ public class TemplateBundleTrackerCustomizer implements BundleTrackerCustomizer< | ||||
| 		if (!isTemplateProvider) | ||||
| 			return null; | ||||
| 		 | ||||
| //		Enumeration<String> entries = bundle.getEntryPaths(TemplateProvider.TEMPLATE_PATH + "/metadata.json"); | ||||
| 		URL metadataUrl = bundle.getEntry(TemplateProvider.TEMPLATE_PATH + "/metadata.json"); | ||||
| 		String metadata = new BufferedReader ( | ||||
| 				  new InputStreamReader( | ||||
| 						  metadataUrl.openStream(), StandardCharsets.UTF_8)) | ||||
| 					.lines() | ||||
| 					.collect(Collectors.joining("\n")); | ||||
| 		 | ||||
| 		GsonBuilder builder = new GsonBuilder(); | ||||
| 		Gson gson = builder.create(); | ||||
|  | ||||
| 		JsonElement je = (new JsonParser()).parse(metadata); | ||||
| 		JsonObject root = je.getAsJsonObject(); | ||||
|  | ||||
| 		JsonElement templatesElement = root.get("templates"); | ||||
| 		if (templatesElement == null) | ||||
| 			return null; | ||||
| 		if (!templatesElement.isJsonArray()) | ||||
| 			return null; | ||||
| 		JsonArray templates = templatesElement.getAsJsonArray(); | ||||
| 		for (int i=0; i<templates.size(); i++) { | ||||
| 			TemplateMetadata meta = gson.fromJson(templates.get(i), TemplateMetadata.class); | ||||
| 			ProvidedTemplate providedTemplate = new ProvidedTemplate(meta); | ||||
| 			result.providedTemplates.add(providedTemplate); | ||||
| 		if (metadataUrl != null) { | ||||
| 			// descriptor is found | ||||
| 			 | ||||
| 			String metadata = new BufferedReader ( | ||||
| 					  new InputStreamReader( | ||||
| 							  metadataUrl.openStream(), StandardCharsets.UTF_8)) | ||||
| 						.lines() | ||||
| 						.collect(Collectors.joining("\n")); | ||||
| 			 | ||||
| 			GsonBuilder builder = new GsonBuilder(); | ||||
| 			Gson gson = builder.create(); | ||||
| 	 | ||||
| 			JsonElement je = (new JsonParser()).parse(metadata); | ||||
| 			JsonObject root = je.getAsJsonObject(); | ||||
| 	 | ||||
| 			JsonElement templatesElement = root.get("templates"); | ||||
| 			if (templatesElement == null) | ||||
| 				return null; | ||||
| 			if (!templatesElement.isJsonArray()) | ||||
| 				return null; | ||||
| 			JsonArray templates = templatesElement.getAsJsonArray(); | ||||
| 			for (int i=0; i<templates.size(); i++) { | ||||
| 				TemplateMetadata meta = gson.fromJson(templates.get(i), TemplateMetadata.class); | ||||
| 				ProvidedTemplate providedTemplate = new ProvidedTemplate(meta); | ||||
| 				result.providedTemplates.add(providedTemplate); | ||||
| 			} | ||||
| 		 | ||||
| 		} else { | ||||
| 			// try to locate templates | ||||
| 			 | ||||
| 			log.debug("BEGIN :: Searching for templates in " + bundle.getBundleId()); | ||||
| 			 | ||||
| 			Enumeration<URL> foundEntries = bundle.findEntries(TemplateProvider.TEMPLATE_PATH, "*.*", true); | ||||
| 			while (foundEntries.hasMoreElements()) { | ||||
| 				URL entry = foundEntries.nextElement(); | ||||
| 				log.debug("FOUND :: " + entry.toString()); | ||||
| 				if (entry.toString().endsWith("/")) { | ||||
| 					log.debug(":: .. is folder"); | ||||
| 					continue; | ||||
| 				} | ||||
| 				String localPath = entry.toString(); | ||||
| 				localPath = localPath.substring(localPath.indexOf(TemplateProvider.TEMPLATE_PATH) + TemplateProvider.TEMPLATE_PATH.length() + 1); | ||||
| 				String fullname = localPath.substring(localPath.lastIndexOf("/")+1); | ||||
| 				String path = localPath.lastIndexOf("/")>=0 | ||||
| 						?localPath.substring(0, localPath.lastIndexOf("/")) | ||||
| 						:""; | ||||
| 				String fullPath = TemplateProvider.TEMPLATE_PATH + "/" + path; | ||||
| 				String fileName = fullname.substring(0, fullname.lastIndexOf(".")); | ||||
| 				String fileType = fullname.substring(fullname.lastIndexOf(".")+1); | ||||
| 				String id = path.replace("/", ".")  | ||||
| 						+ (path.isEmpty()?"":".")  | ||||
| 						+ fileName; | ||||
| 				log.debug(":: localPath = " + localPath + "; fullName = " + fullname + "; fileName = " + fileName | ||||
| 						+ "; fileType = " + fileType + "; path = " + path); | ||||
| 				 | ||||
| 				TemplateMetadata meta = new TemplateMetadata(); | ||||
| 				meta.setId(id); | ||||
| 				meta.setFilename(fileName); | ||||
| 				meta.setFullname(fullname); | ||||
| 				meta.setName(id); | ||||
| 				meta.setType(fileType); | ||||
| 				meta.setPath(fullPath); | ||||
| 				meta.setDescription("Found in bundle [" + bundle.getBundleId() + "] on path [" + localPath + "]"); | ||||
| 				ProvidedTemplate providedTemplate = new ProvidedTemplate(meta); | ||||
| 				result.providedTemplates.add(providedTemplate); | ||||
| 			} | ||||
| 			 | ||||
| 			log.debug("END :: Searching for templates in " + bundle.getBundleId()); | ||||
| 		} | ||||
| 		 | ||||
| 		return result; | ||||
| @@ -135,6 +183,9 @@ public class TemplateBundleTrackerCustomizer implements BundleTrackerCustomizer< | ||||
| 			props.put(TemplateService.PROP_NAME, provided.getName()); | ||||
| 			props.put(TemplateService.PROP_TYPE, provided.getType()); | ||||
| 			props.put(TemplateService.PROP_DESCRIPTION, provided.getDescription()); | ||||
| 			if (provided.getAdditionalProperties() != null) { | ||||
| 				provided.getAdditionalProperties().forEach((k,v) -> {props.put(TemplateService.PROP_PREFIX + k, v);}); | ||||
| 			} | ||||
| 			 | ||||
| 			ServiceRegistration<Template> registration =  | ||||
| 					templateProvider.bundleContext.registerService( | ||||
|   | ||||
| @@ -19,6 +19,7 @@ | ||||
|  */ | ||||
| package ru.entaxy.base.generator.template.impl; | ||||
|  | ||||
| import java.util.Map; | ||||
| import java.util.UUID; | ||||
|  | ||||
| import ru.entaxy.platform.base.support.CommonUtils; | ||||
| @@ -32,6 +33,7 @@ public class TemplateMetadata { | ||||
| 	protected String fullname; | ||||
| 	protected String path; | ||||
| 	protected String description = ""; | ||||
| 	protected Map<String, String> additionalProperties; | ||||
| 	 | ||||
| 	public String getId() { | ||||
| 		return id; | ||||
| @@ -93,5 +95,11 @@ public class TemplateMetadata { | ||||
| 	public void setDescription(String description) { | ||||
| 		this.description = description; | ||||
| 	} | ||||
| 	public Map<String, String> getAdditionalProperties() { | ||||
| 		return additionalProperties; | ||||
| 	} | ||||
| 	public void setAdditionalProperties(Map<String, String> additionalProperties) { | ||||
| 		this.additionalProperties = additionalProperties; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
|   | ||||
| @@ -29,7 +29,7 @@ public interface Generated { | ||||
|  | ||||
| 	public static final String GENERATED_TYPE_BLUEPRINT = "blueprint"; | ||||
|  | ||||
| 	public static final String GENERATED_TYPE_BLUEPRINT_NODE = "blueprint-node"; | ||||
| 	public static final String GENERATED_TYPE_BLUEPRINT_FRAGMENT = "blueprint.fragment"; | ||||
|  | ||||
| 	public static Generated create() { | ||||
| 		return new GeneratedImpl(); | ||||
|   | ||||
| @@ -28,4 +28,5 @@ public interface Generator { | ||||
| 	 | ||||
| 	public String getGeneratorId(); | ||||
|     public Generated generate(Map<String, Object> properties) throws Exception; | ||||
|     public boolean isGeneratable(Map<String, Object> properties) throws Exception; | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>generator</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
|         <artifactId>connecting</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
| @@ -21,5 +21,6 @@ | ||||
|         <module>ftl-generator</module> | ||||
|         <module>generator-factory</module> | ||||
|         <module>common-templates-collection</module> | ||||
|         <module>template-service-shell</module> | ||||
|     </modules> | ||||
| </project> | ||||
| @@ -0,0 +1,201 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| @@ -0,0 +1,50 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|     <artifactId>generator</artifactId> | ||||
|     <version>1.8.2</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.platform.runtime.base.connecting.generator</groupId> | ||||
|   <artifactId>template-service-shell</artifactId> | ||||
|   <packaging>bundle</packaging> | ||||
|   <name>ENTAXY :: PLATFORM :: BASE :: TEMPLATES :: SHELL</name> | ||||
|   <description>ENTAXY :: PLATFORM :: BASE :: TEMPLATES :: SHELL</description> | ||||
|    | ||||
|   <properties> | ||||
|         <bundle.osgi.remove.headers>NONE</bundle.osgi.remove.headers> | ||||
|   </properties> | ||||
|  | ||||
|  | ||||
| 	<dependencies> | ||||
| 		<dependency> | ||||
| 			<groupId>org.apache.karaf</groupId> | ||||
| 			<artifactId>org.apache.karaf.util</artifactId> | ||||
| 		</dependency> | ||||
| 	  	<dependency> | ||||
| 	  		<groupId>org.apache.karaf.shell</groupId> | ||||
| 	  		<artifactId>org.apache.karaf.shell.core</artifactId> | ||||
| 	  		<version>${karaf.version}</version> | ||||
| 	  	</dependency> | ||||
| 	    <dependency> | ||||
| 	    	<groupId> | ||||
| 	    		ru.entaxy.esb.platform.runtime.base.connecting.generator | ||||
| 	    	</groupId> | ||||
| 	    	<artifactId>generator-api</artifactId> | ||||
| 	    	<version>${project.version}</version> | ||||
| 	    </dependency> | ||||
| 	    <dependency> | ||||
| 	    	<groupId> | ||||
| 	    		ru.entaxy.esb.platform.runtime.base.connecting.generator | ||||
| 	    	</groupId> | ||||
| 	    	<artifactId>generator-factory</artifactId> | ||||
| 	    	<version>${project.version}</version> | ||||
| 	    </dependency> | ||||
| 	    <dependency> | ||||
| 	    	<groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
| 	    	<artifactId>base-support</artifactId> | ||||
| 	    	<version>${project.version}</version> | ||||
| 	    </dependency> | ||||
| 	</dependencies> | ||||
| 	   | ||||
| </project> | ||||
| @@ -0,0 +1,88 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * template-service-test | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2021 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.base.generator.template.shell; | ||||
|  | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| import org.apache.karaf.shell.api.action.Action; | ||||
| import org.apache.karaf.shell.api.action.Argument; | ||||
| import org.apache.karaf.shell.api.action.Command; | ||||
| import org.apache.karaf.shell.api.action.lifecycle.Service; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.GsonBuilder; | ||||
| import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonParser; | ||||
|  | ||||
| import ru.entaxy.base.generator.template.Template; | ||||
| import ru.entaxy.base.generator.template.TemplateAwareGenerator; | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated; | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generator; | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.factory.GeneratorFactory; | ||||
| import ru.entaxy.platform.base.support.CommonUtils; | ||||
| import ru.entaxy.platform.base.support.JSONUtils; | ||||
|  | ||||
| @Service | ||||
| @Command(scope = "templates", name = "generate") | ||||
| public class Generate extends TemplateServiceSupport implements Action { | ||||
|  | ||||
| 	@Argument(index = 0, name = "template-id", required = true) | ||||
| 	String templateId; | ||||
| 	 | ||||
| 	@Argument(index = 1, name = "parameters", required = false) | ||||
| 	String params; | ||||
| 	 | ||||
| 	@Override | ||||
| 	public Object execute() throws Exception { | ||||
| 		Template t = templateService.getTemplateById(templateId); | ||||
| 		if (t == null) { | ||||
| 			System.out.println("Template [" + templateId + "] not found"); | ||||
| 			return null; | ||||
| 		} | ||||
| 		TemplateAwareGenerator g = GeneratorFactory.createGenerator(t); | ||||
| 		if (g == null) { | ||||
| 			System.out.println("Generator for template [" + templateId + "] not found"); | ||||
| 			return null; | ||||
| 		} | ||||
| 		Generated result = null; | ||||
| 		if (CommonUtils.isValid(params)) { | ||||
| 			GsonBuilder builder = new GsonBuilder(); | ||||
| 			Gson gson = builder.create(); | ||||
|  | ||||
| 			JsonElement je = (new JsonParser()).parse(params); | ||||
| 			Map<String, Object> map = JSONUtils.element2map(je); | ||||
|  | ||||
| 			result = g.generate(t, map); | ||||
| 		} else { | ||||
| 			result = g.generate(t, new HashMap<>());  | ||||
| 		} | ||||
| 		if (result == null) { | ||||
| 			System.out.println("Generated is empty, template: [" + templateId + "] not found"); | ||||
| 			return null; | ||||
| 		} else { | ||||
| 			System.out.println("Generated: "); | ||||
| 			System.out.println("\ttype: " + result.getType()); | ||||
| 			System.out.println("\tcontent: " + (result.getObject()==null?"null":"[==\n" + result.getObject().toString() + "\n==]")); | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,69 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * template-service-test | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2021 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.base.generator.template.shell; | ||||
|  | ||||
| import java.util.Comparator; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import org.apache.karaf.shell.api.action.Action; | ||||
| import org.apache.karaf.shell.api.action.Command; | ||||
| import org.apache.karaf.shell.api.action.lifecycle.Service; | ||||
| import org.apache.karaf.shell.support.table.ShellTable; | ||||
|  | ||||
| import ru.entaxy.base.generator.template.Template; | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generator; | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.factory.GeneratorFactory; | ||||
|  | ||||
| @Service | ||||
| @Command(scope = "templates", name = "list") | ||||
| public class ListTemplates extends TemplateServiceSupport implements Action { | ||||
|  | ||||
| 	@Override | ||||
| 	public Object execute() throws Exception { | ||||
| 		 | ||||
| 		ShellTable table = new ShellTable(); | ||||
| 		table.column("id"); | ||||
| 		table.column("File"); | ||||
| 		table.column("Location"); | ||||
| 		table.column("Generator"); | ||||
| 		 | ||||
| 		for (Template t: templateService.getAllTemplates().stream().sorted(new Comparator<Template>() { | ||||
|  | ||||
| 			@Override | ||||
| 			public int compare(Template o1, Template o2) { | ||||
| 				return o1.getId().compareToIgnoreCase(o2.getId()); | ||||
| 			} | ||||
| 			 | ||||
| 		}).collect(Collectors.toList()) ) { | ||||
| 			Generator g = (Generator)GeneratorFactory.createGenerator(t); | ||||
| 			table.addRow().addContent( | ||||
| 					t.getId(), | ||||
| 					t.getTemplateFullName(), | ||||
| 					t.getTemplateLocation()==null?"":t.getTemplateLocation().toString(),  | ||||
| 					(g==null?"NOT FOUND":g.getGeneratorId()) | ||||
| 				); | ||||
| 		} | ||||
| 		 | ||||
| 		table.print(System.out); | ||||
| 		 | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,31 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * template-service-test | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2021 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.base.generator.template.shell; | ||||
|  | ||||
| import org.apache.karaf.shell.api.action.lifecycle.Reference; | ||||
|  | ||||
| import ru.entaxy.base.generator.template.TemplateService; | ||||
|  | ||||
| public class TemplateServiceSupport { | ||||
| 	@Reference | ||||
| 	TemplateService templateService; | ||||
| 	 | ||||
|  | ||||
| } | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime</groupId> | ||||
|         <artifactId>base</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>producer</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
|         <artifactId>connecting</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId> | ||||
|         <artifactId>producer</artifactId> | ||||
|         <version>1.8.1</version> | ||||
|         <version>1.8.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.platform.runtime</groupId> | ||||
|     <artifactId>base</artifactId> | ||||
|     <version>1.8.1</version> | ||||
|     <version>1.8.2</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
|   <artifactId>management-core</artifactId> | ||||
|   | ||||
| @@ -46,7 +46,7 @@ public class AnnotatedMBean<I> extends StandardMBean { | ||||
|  | ||||
| 	@Override | ||||
| 	public MBeanInfo getMBeanInfo() { | ||||
| 		log.info(this.interfaceClass==null?">> INTERFACE IS NULL":">> " + this.interfaceClass.getName()); | ||||
| 		log.debug(this.interfaceClass==null?">> INTERFACE IS NULL":">> " + this.interfaceClass.getName()); | ||||
| 		MBeanExportPolicy policy = MBeanExportPolicy.IGNORE_ANNOTATIONS; | ||||
| 		MBeanAnnotated anno = this.interfaceClass.getAnnotation(MBeanAnnotated.class); | ||||
| 		if (anno != null) | ||||
|   | ||||
| @@ -0,0 +1,34 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * management-core | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.esb.platform.base.management.core.api; | ||||
|  | ||||
| import static java.lang.annotation.ElementType.TYPE; | ||||
| import static java.lang.annotation.RetentionPolicy.RUNTIME; | ||||
|  | ||||
| import java.lang.annotation.Inherited; | ||||
| import java.lang.annotation.Retention; | ||||
| import java.lang.annotation.Target; | ||||
|  | ||||
| @Retention(RUNTIME) | ||||
| @Target(TYPE) | ||||
| @Inherited | ||||
| public @interface EntaxyRuntimeTyped { | ||||
| 	String name() default ""; | ||||
| } | ||||
| @@ -0,0 +1,32 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * management-core | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.esb.platform.base.management.core.api; | ||||
|  | ||||
| public interface RuntimeTypedMBean { | ||||
|  | ||||
| 	@Attribute(desc = "Type of Entaxy runtime object") | ||||
| 	public default String getRuntimeType() { | ||||
| 		if (this.getClass().isAnnotationPresent(EntaxyRuntimeTyped.class)) { | ||||
| 			return ((EntaxyRuntimeTyped)this.getClass().getAnnotation(EntaxyRuntimeTyped.class)).name(); | ||||
| 		} else  | ||||
| 			return ""; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -122,7 +122,7 @@ public class BundleAwareMBeanImpl<T extends BundleAwareManagedObject, I> | ||||
| 	public void refreshBundleInfo() { | ||||
| 		Bundle b = FrameworkUtil.getBundle(getClass()).getBundleContext().getBundle(getBundleId()); | ||||
| 		 | ||||
| 		// track bundeState | ||||
| 		// track bundleState | ||||
| 		AttributeChangeTracker tracker = new AttributeChangeTracker(); | ||||
| 		tracker.oldValue(this.managedObject.getBundleState()); | ||||
| 		this.managedObject.bundleState(b.getState()); | ||||
|   | ||||
| @@ -39,6 +39,6 @@ public interface BundleAwareManagedObject { | ||||
|  | ||||
| 	BundleAwareManagedObject bundleId(long bundleId); | ||||
|  | ||||
| 	BundleAwareManagedObject bundleSymbolicName(String bundleSeymbolicName); | ||||
| 	BundleAwareManagedObject bundleSymbolicName(String bundleSymbolicName); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -98,8 +98,8 @@ public class BundleAwareManagedObjectImpl implements BundleAwareManagedObject { | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public BundleAwareManagedObject bundleSymbolicName(String bundleSeymbolicName) { | ||||
| 		setBundleSymbolicName(bundleSeymbolicName); | ||||
| 	public BundleAwareManagedObject bundleSymbolicName(String bundleSymbolicName) { | ||||
| 		setBundleSymbolicName(bundleSymbolicName); | ||||
| 		return this; | ||||
| 	} | ||||
| 	 | ||||
|   | ||||
| @@ -22,7 +22,7 @@ package ru.entaxy.esb.platform.base.management.core.utils; | ||||
| import org.osgi.framework.ServiceRegistration; | ||||
|  | ||||
| public class ManagedObjectDescriptor<S, I, C extends I> { | ||||
| 	S object; | ||||
| 	C service; | ||||
| 	ServiceRegistration<I> registration; | ||||
| 	public S object; | ||||
| 	public C service; | ||||
| 	public ServiceRegistration<I> registration; | ||||
| } | ||||
|   | ||||
							
								
								
									
										201
									
								
								platform/runtime/base/objects-base/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								platform/runtime/base/objects-base/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										201
									
								
								platform/runtime/base/objects-base/object-factory/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								platform/runtime/base/objects-base/object-factory/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										56
									
								
								platform/runtime/base/objects-base/object-factory/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								platform/runtime/base/objects-base/object-factory/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
|     <artifactId>objects-base</artifactId> | ||||
|     <version>1.8.2</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.platform.runtime.base.objects-base</groupId> | ||||
|   <artifactId>object-factory</artifactId> | ||||
|   <packaging>bundle</packaging> | ||||
|   <name>ENTAXY :: PLATFORM :: BASE :: OBJECT FACTORING :: OBJECT FACTORY</name> | ||||
|   <description>ENTAXY :: PLATFORM :: BASE :: OBJECT FACTORING :: OBJECT FACTORY</description> | ||||
|    | ||||
|   <properties> | ||||
|   	<bundle.osgi.export.pkg> | ||||
| 		ru.entaxy.platform.base.objects.factory, | ||||
| 		ru.entaxy.platform.base.objects.factory.configuration, | ||||
| 		ru.entaxy.platform.base.objects.factory.impl, | ||||
| 		ru.entaxy.platform.base.objects.factory.tracker 	 | ||||
|   	</bundle.osgi.export.pkg> | ||||
|   </properties> | ||||
|    | ||||
|   <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>com.google.code.gson</groupId> | ||||
|             <artifactId>gson</artifactId> | ||||
|         </dependency> | ||||
| 	  	<dependency> | ||||
| 	  		<groupId>org.osgi</groupId> | ||||
| 	  		<artifactId>org.osgi.service.component.annotations</artifactId> | ||||
| 	  	</dependency>         | ||||
|         <dependency> | ||||
|         	<groupId>org.apache.felix</groupId> | ||||
|         	<artifactId>org.apache.felix.scr</artifactId> | ||||
|         </dependency> | ||||
| 	  	<dependency> | ||||
| 	  		<groupId>ru.entaxy.esb.platform.runtime.base</groupId> | ||||
| 	  		<artifactId>base-support</artifactId> | ||||
| 	  		<version>${project.version}</version> | ||||
| 	  	</dependency> | ||||
| 	  	<dependency> | ||||
| 	  		<groupId> | ||||
| 	  			ru.entaxy.esb.platform.runtime.base.connecting.generator | ||||
| 	  		</groupId> | ||||
| 	  		<artifactId>generator-api</artifactId> | ||||
| 	  		<version>${project.version}</version> | ||||
| 	  	</dependency> | ||||
| 	  	<dependency> | ||||
| 	  		<groupId> | ||||
| 	  			ru.entaxy.esb.platform.runtime.base.connecting.generator | ||||
| 	  		</groupId> | ||||
| 	  		<artifactId>generator-factory</artifactId> | ||||
| 	  		<version>${project.version}</version> | ||||
| 	  	</dependency> | ||||
|   </dependencies> | ||||
| </project> | ||||
| @@ -0,0 +1,207 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory; | ||||
|  | ||||
| import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
|  | ||||
| import com.google.gson.JsonObject; | ||||
|  | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated; | ||||
|  | ||||
| public interface EntaxyFactory extends EntaxyFactoryElements.EntaxyFactoryExtendedElement { | ||||
|  | ||||
| 	/* | ||||
| 	 * public constants, enums etc | ||||
| 	 */ | ||||
| 	 | ||||
| 	public static interface SERVICE { | ||||
|  | ||||
| 		String PROP_ID = "factory.id"; | ||||
| 		String PROP_TYPE = "factory.type"; | ||||
| 		String PROP_ORIGIN_BUNDLE = "factory.origin.bundle"; | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	public static interface CONFIGURATION { | ||||
|  | ||||
| 		String FACTORY_SECTION_NAME = "factory"; | ||||
| 		String FIELDS_SECTION_NAME = "fields"; | ||||
| 		String OUTPUTS_SECTION_NAME = "outputs"; | ||||
| 		 | ||||
| 		public static interface FACTORY { | ||||
| 			 | ||||
| 			String ID = "id"; | ||||
| 			String TYPE = "type"; | ||||
| 			String DESCRIPTION = "description"; | ||||
| 			String LABEL = "label"; | ||||
| 			String CATEGORY = "category"; | ||||
| 			 | ||||
| 		} | ||||
| 		 | ||||
| 		public static interface FIELDS { | ||||
| 			 | ||||
| 			public static interface REGULAR_TYPES { | ||||
| 				 | ||||
| 				String STRING = "String"; | ||||
| 				String BOOLEAN = "Boolean"; | ||||
| 				String LONG = "Long"; | ||||
| 				String DOUBLE = "Double"; | ||||
| 				 | ||||
| 				public static Set<String> asSet() { | ||||
| 					return new HashSet<>() {{ | ||||
| 						add(STRING); | ||||
| 						add(BOOLEAN); | ||||
| 						add(DOUBLE); | ||||
| 						add(LONG); | ||||
| 					}}; | ||||
| 				} | ||||
| 				 | ||||
| 			} | ||||
| 			 | ||||
| 			public static interface ATTRIBUTES { | ||||
| 				 | ||||
| 				String FIELD_TYPE = "type"; | ||||
| 				String DEFAULT_VALUE = "defaultValue"; | ||||
| 				 | ||||
| 				String REQUIRED = "required"; | ||||
| 				String IMMUTABLE = "immutable"; | ||||
| 				 | ||||
| 				String IS_REF = "isRef"; | ||||
| 				 | ||||
| 			} | ||||
| 			 | ||||
| 			String OBJECT_ID = "objectId"; | ||||
| 			 | ||||
| 		} | ||||
| 		 | ||||
| 		public static interface OUTPUTS { | ||||
|  | ||||
| 			String OUTPUT_TYPE_INIT = "init"; | ||||
| 			String OUTPUT_TYPE_REF = "ref"; | ||||
| 			 | ||||
| 			public static interface ATTRIBUTES { | ||||
| 			 | ||||
| 				String IS_DEFAULT = "isDefault"; | ||||
| 				String CONFIG = "config"; | ||||
| 				String GENERATOR = "generator"; | ||||
| 				String FIELDS = "fields"; | ||||
| 				String SCOPES = "scopes"; | ||||
| 				 | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| 	static public enum SCOPE { | ||||
| 		PUBLIC("public"), | ||||
| 		PROTECTED("protected"), | ||||
| 		PRIVATE("private"); | ||||
| 		 | ||||
| 	    public String label; | ||||
|  | ||||
| 	    private SCOPE(String label) { | ||||
| 	        this.label = label; | ||||
| 	    } | ||||
| 	     | ||||
| 	    public static SCOPE valueOfLabel(String label) { | ||||
| 	        for (SCOPE e : values()) { | ||||
| 	            if (e.label.equals(label)) { | ||||
| 	                return e; | ||||
| 	            } | ||||
| 	        } | ||||
| 	        return null; | ||||
| 	    }	     | ||||
| 	} | ||||
| 	 | ||||
| 	static public SCOPE DEFAULT_SCOPE = SCOPE.PUBLIC; | ||||
| 	 | ||||
| 	/* | ||||
| 	 * inner structure elements | ||||
| 	 */ | ||||
| 	 | ||||
| 	public static interface OutputInfo { | ||||
| 		 | ||||
| 		public String getType(); | ||||
| 		public String getGenerator(); | ||||
| 		public List<String> getScopes(); | ||||
| 		public Map<String, Object> getConfig(); | ||||
| 		public List<FieldInfo> getFields(); | ||||
| 		public boolean isDefault(); | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	public static interface FieldInfo { | ||||
| 		 | ||||
| 		public String getName(); | ||||
| 		public String getType(); | ||||
| 		public String getDisplayName(); | ||||
| 		public String getDescription(); | ||||
|  | ||||
| 		public boolean isImmutable(); | ||||
| 		public boolean isRequired(); | ||||
| 		public Object getDefaultValue(); | ||||
|  | ||||
| 		public boolean isConditional(); | ||||
| 		public String getCondition(); | ||||
| 		 | ||||
| 		public boolean isRef(); | ||||
| 		public JsonObject getJsonOrigin(); | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	public static interface RefFieldInfo extends FieldInfo { | ||||
| 		 | ||||
| 		public boolean isBackRef(); | ||||
| 		public boolean isRefByValueOnly(); | ||||
| 		 | ||||
| 		public String getRefField(); | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	/* | ||||
| 	 * Factory itself | ||||
| 	 */ | ||||
|  | ||||
| 	@Deprecated() | ||||
| 	public default String getFactoryId() { | ||||
| 		return getId(); | ||||
| 	}; | ||||
| 	@Deprecated | ||||
| 	public default String getFactoryType() { | ||||
| 		return getType(); | ||||
| 	}; | ||||
| 	 | ||||
| 	 | ||||
| 	public List<OutputInfo> getOutputs(); | ||||
| 	public OutputInfo getDefaultOutput(); | ||||
| 	public OutputInfo getOutputByType(String outputType); | ||||
| 	 | ||||
| 	public List<FieldInfo> getFields(); | ||||
| 	public List<FieldInfo> getFields(String outputType); | ||||
| 	 | ||||
| 	public Generated generate(Map<String, Object> parameters) throws EntaxyFactoryException ; | ||||
| 	public Generated generate(String outputType, Map<String, Object> parameters) throws EntaxyFactoryException; | ||||
| 	public Generated generate(String outputType, String scope, Map<String, Object> parameters) throws EntaxyFactoryException; | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,49 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * object-factory | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory; | ||||
|  | ||||
| public interface EntaxyFactoryElements { | ||||
|  | ||||
| 	public interface EntaxyFactoryTypedElement { | ||||
| 		 | ||||
| 		String getType(); | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	public interface EntaxyFactoryLabeledElement { | ||||
| 		 | ||||
| 		String getLabel(); | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	public interface EntaxyFactoryCommonElement extends EntaxyFactoryTypedElement { | ||||
| 		 | ||||
| 		String getId(); | ||||
| 		String getDescription(); | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	public interface EntaxyFactoryExtendedElement extends EntaxyFactoryCommonElement, EntaxyFactoryLabeledElement { | ||||
| 		 | ||||
| 		String getCategory(); | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,24 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory; | ||||
|  | ||||
| public class EntaxyFactoryException extends Exception { | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,33 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.configuration; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.JsonElement; | ||||
|  | ||||
| public abstract class AbstractElement<T> { | ||||
|  | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	public T fromJson(JsonElement jsonElement) { | ||||
| 		Gson gson = new Gson(); | ||||
| 		return (T)gson.fromJson(jsonElement, this.getClass()); | ||||
| 	}; | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,65 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.configuration; | ||||
|  | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
|  | ||||
| public class FactoryElement extends AbstractElement<FactoryElement> { | ||||
| 	 | ||||
| 	public static final String ELEMENT_NAME = EntaxyFactory.CONFIGURATION.FACTORY_SECTION_NAME; | ||||
|  | ||||
| 	protected String id; | ||||
| 	protected String type; | ||||
| 	protected String description; | ||||
| 	protected String label; | ||||
| 	protected String category; | ||||
| 	 | ||||
| 	public String getId() { | ||||
| 		return id; | ||||
| 	} | ||||
| 	public void setId(String id) { | ||||
| 		this.id = id; | ||||
| 	} | ||||
| 	public String getType() { | ||||
| 		return type; | ||||
| 	} | ||||
| 	public void setType(String type) { | ||||
| 		this.type = type; | ||||
| 	} | ||||
| 	public String getDescription() { | ||||
| 		return description; | ||||
| 	} | ||||
| 	public void setDescription(String description) { | ||||
| 		this.description = description; | ||||
| 	} | ||||
| 	public String getLabel() { | ||||
| 		return label; | ||||
| 	} | ||||
| 	public void setLabel(String label) { | ||||
| 		this.label = label; | ||||
| 	} | ||||
| 	public String getCategory() { | ||||
| 		return category; | ||||
| 	} | ||||
| 	public void setCategory(String category) { | ||||
| 		this.category = category; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,168 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.configuration; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | ||||
|  | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
| import ru.entaxy.platform.base.support.JSONUtils; | ||||
|  | ||||
| public class FieldElement implements EntaxyFactory.FieldInfo { | ||||
|  | ||||
| 	JsonObject jsonOrigin = null; | ||||
| 	 | ||||
| 	String name; | ||||
| 	String type; | ||||
| 	String displayName; | ||||
| 	String description = ""; | ||||
| 	 | ||||
| 	boolean immutable = false; | ||||
| 	boolean required = false; | ||||
| 	Object defaultValue = ""; | ||||
|  | ||||
| 	boolean conditional = false; | ||||
| 	String condition = null; | ||||
| 	 | ||||
| 	boolean isRef = false; | ||||
| 	 | ||||
| 	public static FieldElement merge(FieldElement...elements) { | ||||
| 		 | ||||
| 		JsonObject result = new JsonObject(); | ||||
| 		 | ||||
| 		for (int i=0; i<elements.length; i++) { | ||||
| 			JsonElement jsonElement = elements[i].jsonOrigin; | ||||
| 			if (jsonElement == null) | ||||
| 				continue; | ||||
| 			if (!jsonElement.isJsonObject()) | ||||
| 				continue; | ||||
| 			JsonObject jsonObject = jsonElement.getAsJsonObject(); | ||||
| 			JSONUtils.mergeObjects(jsonObject, result); | ||||
| 		} | ||||
| 		 | ||||
| 		FieldElement fe = (new Gson()).fromJson(result, FieldElement.class); | ||||
| 		fe.setJsonOrigin(result.deepCopy()); | ||||
| 		return fe; | ||||
| 	} | ||||
| 	 | ||||
| 	/* EntaxyFactory.FieldInfo implementation */ | ||||
| 	 | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return name; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getDisplayName() { | ||||
| 		return displayName; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getDescription() { | ||||
| 		return description; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getType() { | ||||
| 		return type; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Object getDefaultValue() { | ||||
| 		return defaultValue; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public boolean isRequired() { | ||||
| 		return required; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public boolean isImmutable() { | ||||
| 		return immutable; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public JsonObject getJsonOrigin() { | ||||
| 		return jsonOrigin; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public boolean isConditional() { | ||||
| 		return conditional; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getCondition() { | ||||
| 		return condition; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean isRef() { | ||||
| 		return isRef; | ||||
| 	} | ||||
| 	 | ||||
| 	/* other */ | ||||
| 	 | ||||
| 	public void setName(String name) { | ||||
| 		this.name = name; | ||||
| 	} | ||||
|  | ||||
| 	public void setDisplayName(String displayName) { | ||||
| 		this.displayName = displayName; | ||||
| 	} | ||||
| 	 | ||||
| 	public void setDescription(String description) { | ||||
| 		this.description = description; | ||||
| 	} | ||||
|  | ||||
| 	public void setType(String type) { | ||||
| 		this.type = type; | ||||
| 	} | ||||
|  | ||||
| 	public void setDefaultValue(Object defaultValue) { | ||||
| 		this.defaultValue = defaultValue; | ||||
| 	} | ||||
|  | ||||
| 	public void setRequired(boolean isRequired) { | ||||
| 		this.required = isRequired; | ||||
| 	} | ||||
|  | ||||
| 	public void setImmutable(boolean isImmuable) { | ||||
| 		this.immutable = isImmuable; | ||||
| 	} | ||||
| 	public void setJsonOrigin(JsonObject jsonOrigin) { | ||||
| 		this.jsonOrigin = jsonOrigin; | ||||
| 	} | ||||
|  | ||||
| 	public void setConditional(boolean conditional) { | ||||
| 		this.conditional = conditional; | ||||
| 	} | ||||
|  | ||||
| 	public void setCondition(String condition) { | ||||
| 		this.condition = condition; | ||||
| 	} | ||||
|  | ||||
| 	public void setRef(boolean isRef) { | ||||
| 		this.isRef = isRef; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,89 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.configuration; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
|  | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | ||||
|  | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory.CONFIGURATION.FIELDS; | ||||
|  | ||||
| public class FieldsElement extends AbstractElement<FieldsElement> { | ||||
| 	 | ||||
| 	private static final Logger log = LoggerFactory.getLogger(FieldsElement.class); | ||||
| 	 | ||||
| 	public static final String ELEMENT_NAME = EntaxyFactory.CONFIGURATION.FIELDS_SECTION_NAME; | ||||
|  | ||||
| 	protected Map<String, FieldElement> fields = new HashMap<>(); | ||||
| 	 | ||||
| 	@Override | ||||
| 	public FieldsElement fromJson(JsonElement jsonElement) { | ||||
| 		Gson gson = new Gson();  | ||||
| 		if (jsonElement.isJsonObject()) { | ||||
| 			for (Entry<String, JsonElement> entry : jsonElement.getAsJsonObject().entrySet()) { | ||||
| 				 | ||||
| 				Class<? extends FieldElement> feClass = FieldElement.class; | ||||
| 				 | ||||
| 				if (entry.getValue().isJsonObject()) | ||||
| 					if (entry.getValue().getAsJsonObject().has(FIELDS.ATTRIBUTES.IS_REF)) { | ||||
| 						JsonElement val = entry.getValue().getAsJsonObject().get(FIELDS.ATTRIBUTES.IS_REF); | ||||
| 						if (val.isJsonPrimitive() && val.getAsJsonPrimitive().isBoolean()) | ||||
| 							if (val.getAsJsonPrimitive().getAsBoolean()) { | ||||
| 								feClass = RefFieldElement.class; | ||||
| 							} | ||||
| 					} | ||||
| 				 | ||||
| 				FieldElement fe = gson.fromJson(entry.getValue(), feClass); | ||||
| 				fe.setName(entry.getKey()); | ||||
| 				fe.setJsonOrigin(entry.getValue().isJsonObject()?entry.getValue().getAsJsonObject():new JsonObject()); | ||||
| 				addField(fe); | ||||
| 			} | ||||
| 		} | ||||
| 		/* | ||||
| 		 * this.fields = gson.fromJson( jsonElement, | ||||
| 		 * TypeToken.getParameterized(ArrayList.class, FieldElement.class).getType() ); | ||||
| 		 */ | ||||
| 		// processOutputs(); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	protected void addField(FieldElement fieldElement) { | ||||
| 		this.fields.put(fieldElement.getName(), fieldElement); | ||||
| 	} | ||||
| 	 | ||||
| 	public Map<String, FieldElement> getFieldsMap(){ | ||||
| 		return this.fields; | ||||
| 	} | ||||
| 	 | ||||
| 	public List<FieldElement> getFields() { | ||||
| 		return new ArrayList<>(fields.values()); | ||||
| 	}	 | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,231 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.configuration; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
| import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
| import java.util.Set; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.JsonArray; | ||||
| import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | ||||
|  | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.factory.GeneratorFactory; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory.FieldInfo; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory.SCOPE; | ||||
|  | ||||
| public class OutputElement implements EntaxyFactory.OutputInfo { | ||||
| 	 | ||||
| 	private static final Logger log = LoggerFactory.getLogger(OutputElement.class); | ||||
| 	 | ||||
| 	protected String type; | ||||
| 	protected String generator = GeneratorFactory.DEFAULT_GENERATOR; | ||||
| 	protected boolean isDefault = false; | ||||
| 	 | ||||
| 	protected List<String> scopes = Arrays.asList(new String[] {EntaxyFactory.SCOPE.PUBLIC.name()}); | ||||
| 	protected Set<SCOPE> supportedScopes = new HashSet<>( Arrays.asList(new SCOPE[] {EntaxyFactory.SCOPE.PUBLIC}) ); | ||||
| 	 | ||||
| 	protected Map<String, Object> config = new HashMap<>(); | ||||
|  | ||||
| 	protected JsonObject origin; | ||||
| 	 | ||||
| 	protected FieldsElement fields = null; | ||||
| 	 | ||||
| 	protected Map<String, FieldElement> commonFields = new HashMap<>();  | ||||
| 	 | ||||
| 	protected Map<String, FieldElement> effectiveFields = new HashMap<>(); | ||||
| 	 | ||||
| 	protected boolean isEffectiveCalculated = false; | ||||
| 	 | ||||
| 	public static OutputElement fromJson(JsonObject jsonObject) { | ||||
| 		Gson gson = new Gson(); | ||||
| 		 | ||||
| 		OutputElement result = gson.fromJson(jsonObject, OutputElement.class); | ||||
| 		result.setOrigin(jsonObject); | ||||
| 		result.updateFromOrigin(); | ||||
| 		 | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	public static OutputElement fromJson(String type, JsonObject jsonObject) { | ||||
| 		OutputElement result = OutputElement.fromJson(jsonObject); | ||||
| 		result.setType(type); | ||||
| 		return result; | ||||
| 	} | ||||
| 	 | ||||
| 	public OutputElement() { | ||||
| 		super(); | ||||
| 	} | ||||
| 	 | ||||
| 	public void updateFromOrigin() { | ||||
| 		if (origin.has(EntaxyFactory.CONFIGURATION.OUTPUTS.ATTRIBUTES.FIELDS)) { | ||||
| 			JsonElement fieldsElement = origin.get(EntaxyFactory.CONFIGURATION.OUTPUTS.ATTRIBUTES.FIELDS); | ||||
| 			this.fields = (new FieldsElement()).fromJson(fieldsElement);  | ||||
| 		} | ||||
| 		if (origin.has(EntaxyFactory.CONFIGURATION.OUTPUTS.ATTRIBUTES.SCOPES)) { | ||||
| 			JsonElement scopesElement = origin.get(EntaxyFactory.CONFIGURATION.OUTPUTS.ATTRIBUTES.SCOPES); | ||||
| 			if (scopesElement.isJsonArray()) { | ||||
| 				JsonArray ja = scopesElement.getAsJsonArray(); | ||||
| 				List<String> scopes = new ArrayList<>(); | ||||
| 				for (int i=0; i<ja.size(); i++) | ||||
| 					scopes.add(ja.get(i).getAsString()); | ||||
| 				setScopes(scopes); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	protected void calculateEffective() { | ||||
| 		 | ||||
| 		this.effectiveFields.clear(); | ||||
| 		 | ||||
| 		log.debug("-> " + getType() + " calculateEffective :: " + this.commonFields.size()); | ||||
|  | ||||
| 		Map<String, FieldElement> ownedFields; | ||||
| 		 | ||||
| 		if (fields == null) { | ||||
| 			// get all common fields | ||||
| 			log.debug("-> " + getType() + " taking all common fields"); | ||||
| 			ownedFields = Collections.emptyMap(); | ||||
| 			if (commonFields != null) | ||||
| 				for (Entry<String, FieldElement> entry: commonFields.entrySet()) { | ||||
| 					this.effectiveFields.put(entry.getKey(), entry.getValue()); | ||||
| 				} | ||||
| 			 | ||||
| 		} else { | ||||
| 			// use only locally mentioned fields | ||||
| 			ownedFields = fields.getFieldsMap(); | ||||
| 			log.debug("->" + getType() + " ownedFields: " + fields.getFieldsMap().size()); | ||||
| 			 | ||||
| 			if (commonFields != null) | ||||
| 				for (Entry<String, FieldElement> entry: commonFields.entrySet()) { | ||||
| 					if (ownedFields.containsKey(entry.getKey())) { | ||||
| 						FieldElement fe = FieldElement.merge(entry.getValue(), ownedFields.get(entry.getKey())); | ||||
| 						fe.setName(entry.getKey()); | ||||
| 						this.effectiveFields.put(entry.getKey(), fe); | ||||
| 					} | ||||
| 				} | ||||
| 		} | ||||
| 		for (Entry<String, FieldElement> entry: ownedFields.entrySet()) | ||||
| 			if (!this.effectiveFields.containsKey(entry.getKey())) | ||||
| 				this.effectiveFields.put(entry.getKey(), entry.getValue()); | ||||
| 		 | ||||
| 		this.isEffectiveCalculated = true; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public String getType() { | ||||
| 		return type; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getGenerator() { | ||||
| 		return generator; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public List<String> getScopes() { | ||||
| 		return this.supportedScopes.stream().map(s -> s.label).collect(Collectors.toList()); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public Map<String, Object> getConfig() { | ||||
| 		return config; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<FieldInfo> getFields() { | ||||
| 		if (!this.isEffectiveCalculated) | ||||
| 			calculateEffective(); | ||||
| 		return this.effectiveFields.values().stream().map(f->(FieldInfo)f).collect(Collectors.toList()); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public boolean isDefault() { | ||||
| 		return isDefault; | ||||
| 	} | ||||
|  | ||||
| 	public void setType(String type) { | ||||
| 		this.type = type; | ||||
| 	} | ||||
| 	public void setGenerator(String generator) { | ||||
| 		this.generator = generator; | ||||
| 	} | ||||
| 	 | ||||
| 	public void setScopes(String[] scopes) { | ||||
| 		log.debug("\n\tsetScopes(String[] scopes)"); | ||||
| 		if (scopes == null) { | ||||
| 			setScopes(Collections.<String>emptyList()); | ||||
| 		} else { | ||||
| 			setScopes(Arrays.asList(scopes)); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	public void setScopes(List<String> scopes) { | ||||
| 		log.debug("\n\tsetScopes(List<String> scopes)"); | ||||
| 		this.scopes.clear(); | ||||
| 		this.supportedScopes.clear(); | ||||
| 		for (String s: scopes) { | ||||
| 			this.scopes.add(s.toLowerCase()); | ||||
| 			this.supportedScopes.add(SCOPE.valueOfLabel(s)); | ||||
| 		} | ||||
| 	} | ||||
| 	public Set<SCOPE> getSupportedScopes() { | ||||
| 		return supportedScopes; | ||||
| 	} | ||||
| 	public boolean isScopeSupported(String scope) { | ||||
| 		return isScopeSupported(SCOPE.valueOfLabel(scope)); | ||||
| 	} | ||||
| 	public boolean isScopeSupported(SCOPE scope) { | ||||
| 		return supportedScopes.contains(scope); | ||||
| 	} | ||||
| 	public void setDefault(boolean isDefault) { | ||||
| 		this.isDefault = isDefault; | ||||
| 	} | ||||
| 	 | ||||
| 	public void setConfig(Map<String, Object> config) { | ||||
| 		this.config = config; | ||||
| 	} | ||||
|  | ||||
| 	public JsonObject getOrigin() { | ||||
| 		return origin; | ||||
| 	} | ||||
|  | ||||
| 	public void setOrigin(JsonObject origin) { | ||||
| 		this.origin = origin; | ||||
| 	} | ||||
|  | ||||
| 	public void setCommonFields(Map<String, FieldElement> commonFields) { | ||||
| 		this.commonFields = commonFields; | ||||
| 		this.isEffectiveCalculated = false; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,111 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.configuration; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.JsonElement; | ||||
| import com.google.gson.reflect.TypeToken; | ||||
|  | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
| import ru.entaxy.platform.base.support.CommonUtils; | ||||
|  | ||||
| public class OutputsElement extends AbstractElement<OutputsElement> { | ||||
| 	 | ||||
| 	public static final String ELEMENT_NAME = EntaxyFactory.CONFIGURATION.OUTPUTS_SECTION_NAME; | ||||
| 	 | ||||
| 	public static final String DEFAULT_OUTPUT_TYPE = "init"; | ||||
| 	 | ||||
| 	// protected List<OutputElement> outputs = new ArrayList<>(); | ||||
| 	 | ||||
| 	protected Map<String, OutputElement> outputsMap = new HashMap<>(); | ||||
| 	 | ||||
| 	protected Map<String, FieldElement> commonFields = new HashMap<>(); | ||||
| 	 | ||||
| 	protected String defaultOutputType = ""; | ||||
| 	 | ||||
| 	@Override | ||||
| 	public OutputsElement fromJson(JsonElement jsonElement) { | ||||
| 		Gson gson = new Gson();  | ||||
| 		/* | ||||
| 		 * this.outputs = gson.fromJson( jsonElement, | ||||
| 		 * TypeToken.getParameterized(ArrayList.class, OutputElement.class).getType() ); | ||||
| 		 * processOutputs(); | ||||
| 		 */		 | ||||
| 		 | ||||
| 		if (jsonElement.isJsonObject()) { | ||||
| 			for (Entry<String, JsonElement> entry: jsonElement.getAsJsonObject().entrySet()) { | ||||
| 				OutputElement oe = gson.fromJson(entry.getValue(), OutputElement.class); | ||||
| 				oe.setType(entry.getKey()); | ||||
| 				oe.setCommonFields(commonFields); | ||||
| 				if (entry.getValue().isJsonObject()) | ||||
| 					oe.setOrigin(entry.getValue().getAsJsonObject()); | ||||
| 				oe.updateFromOrigin(); | ||||
| 				if (oe.isDefault) | ||||
| 					this.defaultOutputType = oe.getType(); | ||||
| 				addOutput(oe); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (!CommonUtils.isValid(defaultOutputType)) | ||||
| 			if (outputsMap.containsKey(DEFAULT_OUTPUT_TYPE)) { | ||||
| 				this.defaultOutputType = DEFAULT_OUTPUT_TYPE; | ||||
| 				this.outputsMap.get(DEFAULT_OUTPUT_TYPE).setDefault(true); | ||||
| 			} | ||||
| 		 | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	protected void addOutput(OutputElement oe) { | ||||
| 		this.outputsMap.put(oe.getType(), oe); | ||||
| 	} | ||||
| 	 | ||||
| 	public List<OutputElement> getOutputs() { | ||||
| 		return new ArrayList<>(outputsMap.values()); | ||||
| 	} | ||||
|  | ||||
| 	public String getDefaultOutputType() { | ||||
| 		return defaultOutputType; | ||||
| 	} | ||||
|  | ||||
| 	public void setDefaultOutputType(String defaultOutputType) { | ||||
| 		this.defaultOutputType = defaultOutputType; | ||||
| 	} | ||||
|  | ||||
| 	public boolean hasOutput(String type) { | ||||
| 		return this.outputsMap.containsKey(type); | ||||
| 	} | ||||
| 	 | ||||
| 	public OutputElement getOutput(String type) { | ||||
| 		return this.outputsMap.get(type); | ||||
| 	} | ||||
| 	 | ||||
| 	public void setCommonFields(Map<String, FieldElement> commonFields) { | ||||
| 		this.commonFields = commonFields; | ||||
| 		for (OutputElement oe: outputsMap.values()) | ||||
| 			oe.setCommonFields(commonFields); | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,64 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.configuration; | ||||
|  | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory.CONFIGURATION.FIELDS; | ||||
|  | ||||
| public class RefFieldElement extends FieldElement implements EntaxyFactory.RefFieldInfo { | ||||
|  | ||||
| 	protected boolean isBackRef = false; | ||||
| 	protected boolean isRefByValueOnly = false; | ||||
| 	 | ||||
| 	protected String refField = FIELDS.OBJECT_ID; | ||||
| 	 | ||||
| 	/* EntaxyFactory.RefFieldInfo */ | ||||
| 	 | ||||
| 	@Override | ||||
| 	public boolean isBackRef() { | ||||
| 		return isBackRef; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean isRefByValueOnly() { | ||||
| 		return isRefByValueOnly; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getRefField() { | ||||
| 		return refField; | ||||
| 	} | ||||
|  | ||||
| 	/* others */ | ||||
| 	 | ||||
| 	public void setBackRef(boolean isBackRef) { | ||||
| 		this.isBackRef = isBackRef; | ||||
| 	} | ||||
|  | ||||
| 	public void setRefByValueOnly(boolean isRefByValueOnly) { | ||||
| 		this.isRefByValueOnly = isRefByValueOnly; | ||||
| 	} | ||||
|  | ||||
| 	public void setRefField(String refField) { | ||||
| 		this.refField = refField; | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,257 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.impl; | ||||
|  | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
| import java.util.Set; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.GsonBuilder; | ||||
| import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | ||||
| import com.google.gson.JsonParser; | ||||
|  | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactoryException; | ||||
| import ru.entaxy.platform.base.objects.factory.configuration.AbstractElement; | ||||
| import ru.entaxy.platform.base.objects.factory.configuration.FactoryElement; | ||||
| import ru.entaxy.platform.base.objects.factory.configuration.FieldsElement; | ||||
| import ru.entaxy.platform.base.objects.factory.configuration.OutputElement; | ||||
| import ru.entaxy.platform.base.objects.factory.configuration.OutputsElement; | ||||
| import ru.entaxy.platform.base.support.CommonUtils; | ||||
| import ru.entaxy.platform.base.support.JSONUtils; | ||||
| import ru.entaxy.platform.base.support.osgi.OSGIUtils; | ||||
|  | ||||
| public class DefaultFactory implements EntaxyFactory { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(DefaultFactory.class); | ||||
| 	 | ||||
| 	protected Map<String, Class<? extends AbstractElement<?>>> elementClasses = new HashMap<>(); | ||||
|  | ||||
| 	protected String factoryId = ""; | ||||
| 	 | ||||
| 	protected String factoryType = ""; | ||||
| 	 | ||||
| 	protected String description; | ||||
| 	 | ||||
| 	protected String label; | ||||
| 	 | ||||
| 	protected String category; | ||||
| 	 | ||||
| 	protected FieldsElement fields = null; | ||||
| 	 | ||||
| 	protected OutputsElement outputs = new OutputsElement(); | ||||
| 	 | ||||
| 	protected Map<String, Object> factoryData = new HashMap<>(); | ||||
| 	 | ||||
| 	protected GenerationHelper helper = null; | ||||
| 	 | ||||
| 	public DefaultFactory() { | ||||
| 		super(); | ||||
| 		elementClasses.put(FactoryElement.ELEMENT_NAME, FactoryElement.class); | ||||
| 		elementClasses.put(OutputsElement.ELEMENT_NAME, OutputsElement.class); | ||||
| 		elementClasses.put(FieldsElement.ELEMENT_NAME, FieldsElement.class); | ||||
| 	} | ||||
| 	 | ||||
| 	protected GenerationHelper getHelper() { | ||||
| 		if (this.helper == null) { | ||||
| 			try { | ||||
| 				helper = OSGIUtils.services().ofClass(GenerationHelper.class).waitService(5000).get(); | ||||
| 			} catch (Exception e) { | ||||
| 				// TODO Auto-generated catch block | ||||
| 				log.error("Error getting GenerationHelper", e); | ||||
| 			} | ||||
| 		} | ||||
| 		return this.helper; | ||||
| 	} | ||||
| 	 | ||||
| 	public void configure(String configuration) { | ||||
|  | ||||
| 		log.debug("CONFIGURE WITH: " + configuration); | ||||
| 		 | ||||
| 		GsonBuilder builder = new GsonBuilder(); | ||||
| 		Gson gson = builder.create(); | ||||
|  | ||||
| 		JsonElement je = (new JsonParser()).parse(configuration); | ||||
| 		JsonObject root = je.getAsJsonObject();		 | ||||
| 		 | ||||
| 		Set<Entry<String, JsonElement>> elementSet = root.entrySet(); | ||||
| 		for (Entry<String, JsonElement> entry: elementSet) { | ||||
| 			String name = entry.getKey(); | ||||
| 			Object result = null; | ||||
| 			if (elementClasses.containsKey(name)) { | ||||
| 				log.debug("FOUND element class  for [" + name + "] :: " + elementClasses.get(name)); | ||||
| 				try { | ||||
| 					result = elementClasses.get(name).getConstructor().newInstance().fromJson(entry.getValue()); | ||||
| 				} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | ||||
| 						| InvocationTargetException | NoSuchMethodException | SecurityException e) { | ||||
| 					log.error("Error deserializing [" + name + "]", e); | ||||
| 					continue; | ||||
| 				}  | ||||
| 						// gson.fromJson(entry.getValue(), elementClasses.get(name)); | ||||
| 			} else | ||||
| 				result = JSONUtils.element2object(entry.getValue()); | ||||
| 			factoryData.put(name, result); | ||||
| 			postprocess(name, result); | ||||
| 		} | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	protected void postprocess(String name, Object object) { | ||||
| 		if (object instanceof FactoryElement) { | ||||
| 			FactoryElement fe = (FactoryElement)object; | ||||
| 			log.debug("POSTPROCESS :: FactoryElement"); | ||||
| 			if (CommonUtils.isValid(fe.getId())) | ||||
| 				this.factoryId = fe.getId(); | ||||
| 			this.factoryType = fe.getType(); | ||||
| 			this.category = fe.getCategory(); | ||||
| 			this.label = fe.getLabel(); | ||||
| 			this.description = fe.getDescription(); | ||||
| 		} else if (object instanceof OutputsElement) { | ||||
| 			log.debug("POSTPROCESS :: OutputsElement"); | ||||
| 			this.outputs = (OutputsElement)object; | ||||
| 			log.debug("POSTPROCESS :: Default output config size -> " +  | ||||
| 					this.outputs.getOutput(this.outputs.getDefaultOutputType()).getConfig().size() | ||||
| 			); | ||||
| 			if (this.fields != null) { | ||||
| 				this.outputs.setCommonFields(this.fields.getFieldsMap()); | ||||
| 				log.debug("COMMON FIELDS :: " + this.fields.getFieldsMap().size()); | ||||
| 			} else { | ||||
| 				log.debug("fields :: null"); | ||||
| 			} | ||||
| 		} else if (object instanceof FieldsElement) { | ||||
| 			log.debug("POSTPROCESS :: FieldsElement"); | ||||
| 			this.fields = (FieldsElement)object; | ||||
| 			if (this.outputs != null) { | ||||
| 				this.outputs.setCommonFields(this.fields.getFieldsMap()); | ||||
| 				log.debug("COMMON FIELDS :: " + this.fields.getFieldsMap().size()); | ||||
| 			} else { | ||||
| 				log.debug("outputs :: null"); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	public boolean isValid() { | ||||
| 		return CommonUtils.isValid(this.factoryId) && CommonUtils.isValid(this.factoryType); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public String getId() { | ||||
| 		return this.factoryId; | ||||
| 	} | ||||
|  | ||||
| 	public void setFactoryId(String factoryId) { | ||||
| 		this.factoryId = factoryId; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getType() { | ||||
| 		return this.factoryType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getDescription() { | ||||
| 		return description; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getLabel() { | ||||
| 		return label; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getCategory() { | ||||
| 		return category; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Generated generate(Map<String, Object> parameters) throws EntaxyFactoryException { | ||||
| 		return generate(this.outputs.getDefaultOutputType(), parameters); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Generated generate(String outputType, Map<String, Object> parameters) throws EntaxyFactoryException { | ||||
| 		if (!this.outputs.hasOutput(outputType)) | ||||
| 			throw new EntaxyFactoryException(); | ||||
| 		return this.generate(outputType, EntaxyFactory.SCOPE.PUBLIC.label, parameters); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public Generated generate(String outputType, String scope, Map<String, Object> parameters) throws EntaxyFactoryException { | ||||
| 		log.debug("Generating for: output type [{}], scope [{}]", outputType, scope); | ||||
| 		 | ||||
| 		if (!this.outputs.hasOutput(outputType)) { | ||||
| 			log.debug("Unknown output: {}", outputType); | ||||
| 			throw new EntaxyFactoryException(); | ||||
| 		} | ||||
| 		 | ||||
| 		OutputElement oe = this.outputs.getOutput(outputType); | ||||
| 		if (!oe.isScopeSupported(scope)) { | ||||
| 			log.error("Scope not supported: {}; supported scopes: [{}]" | ||||
| 					, scope | ||||
| 					, oe.getSupportedScopes().stream().map(s -> s.label).collect(Collectors.joining(","))); | ||||
| 			throw new EntaxyFactoryException(); | ||||
| 		} | ||||
| 		 | ||||
| 		if (this.getHelper() != null) | ||||
| 			try { | ||||
| 				return this.getHelper().generateForFactory(this, outputType, SCOPE.valueOfLabel(scope), parameters); | ||||
| 			} catch (Exception e) { | ||||
| 				log.error("Generate failed", e); | ||||
| 				// TODO fill the exception | ||||
| 				throw new EntaxyFactoryException(); | ||||
| 			} | ||||
| 		return null; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public List<OutputInfo> getOutputs() { | ||||
| 		return this.outputs.getOutputs().stream().map(el->(OutputInfo)el).collect(Collectors.toList()); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public OutputInfo getOutputByType(String outputType) { | ||||
| 		return this.outputs.getOutput(outputType); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<FieldInfo> getFields() { | ||||
| 		return this.fields.getFields().stream().map(f -> (FieldInfo)f).collect(Collectors.toList()); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public List<FieldInfo> getFields(String outputType) { | ||||
| 		return this.outputs.getOutput(outputType).getFields(); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public OutputInfo getDefaultOutput() { | ||||
| 		return (OutputInfo)outputs.getOutput(outputs.getDefaultOutputType()); | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,126 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.impl; | ||||
|  | ||||
| import java.util.LinkedList; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import org.osgi.service.component.annotations.CollectionType; | ||||
| import org.osgi.service.component.annotations.Component; | ||||
| import org.osgi.service.component.annotations.Reference; | ||||
| import org.osgi.service.component.annotations.ReferenceCardinality; | ||||
| import org.osgi.service.component.annotations.ReferencePolicy; | ||||
| import org.osgi.service.component.annotations.ReferencePolicyOption; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import ru.entaxy.base.generator.template.Template; | ||||
| import ru.entaxy.base.generator.template.TemplateService; | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated; | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generator; | ||||
| import ru.entaxy.esb.platform.runtime.base.connecting.generator.factory.GeneratorFactory; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory.OutputInfo; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory.SCOPE; | ||||
|  | ||||
| @Component(immediate = true, service = {GenerationHelper.class}) | ||||
| public class GenerationHelper { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(GenerationHelper.class); | ||||
|  | ||||
| 	@Reference(cardinality = ReferenceCardinality.MANDATORY, collectionType = CollectionType.SERVICE, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY) | ||||
| 	protected volatile TemplateService templateService; | ||||
| 	 | ||||
| 	public Generated generateForFactory(EntaxyFactory factory, String outputType, SCOPE scope, Map<String, Object> parameters) throws Exception { | ||||
| 		 | ||||
| 		log.debug("GENERATING for factory [" + factory.getFactoryId() + "]"); | ||||
| 		log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: PARAMETERS \n" | ||||
| 				 + parameters.entrySet().stream().map(e -> e.getKey() + ":" + (null==e.getValue()?"null":e.getValue())) | ||||
| 				 .collect(Collectors.toList()) | ||||
| 				 .stream().collect(Collectors.joining(", ")) | ||||
| 				); | ||||
| 		 | ||||
| 		OutputInfo outputInfo = factory.getOutputByType(outputType); | ||||
| 		 | ||||
| 		if (outputInfo == null) { | ||||
| 			// @TODO throw Exception | ||||
| 			log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: output [{}] not found", outputType); | ||||
| 			return null; | ||||
| 		} | ||||
| 			 | ||||
| 		if (!outputInfo.getScopes().contains(scope.label)) { | ||||
| 			// @TODO throw Exception | ||||
| 			log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: scope [{}] not supported", scope.label); | ||||
| 			return null; | ||||
| 		} | ||||
| 			 | ||||
| 		// try to generate via GeneratorFactory | ||||
| 		log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: TRY via GeneratorFactory"); | ||||
| 		Generator g = GeneratorFactory.createGenerator(outputInfo.getGenerator(), outputInfo.getConfig()); | ||||
| 		if (g.isGeneratable(parameters)) { | ||||
| 			log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: generating"); | ||||
| 			return g.generate(parameters); | ||||
| 		} else { | ||||
| 			log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: NOT generatable");			 | ||||
| 		} | ||||
| 		 | ||||
| 		// try to generate via TemplateService | ||||
| 		log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: TRY via TemplateService"); | ||||
| 		List<String> candidates = new LinkedList<>(); | ||||
| 		candidates.add(factory.getFactoryId() + "." + outputType + "." + scope.label); | ||||
| 		candidates.add(factory.getFactoryId() + "." + outputType); | ||||
| 		if (outputInfo.isDefault()) { | ||||
| 			candidates.add(factory.getFactoryId() + ".default." + scope.label); | ||||
| 			candidates.add(factory.getFactoryId() + ".default"); | ||||
| 			candidates.add(factory.getFactoryId() + "." + scope.label); | ||||
| 			candidates.add(factory.getFactoryId()); | ||||
| 		} | ||||
| 		 | ||||
| 		log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: CANDIDATES : [" | ||||
| 					+ candidates.stream().collect(Collectors.joining(";")) | ||||
| 					+ "]" | ||||
| 				); | ||||
| 		 | ||||
| 		for (String candidate: candidates) { | ||||
| 			Template t = templateService.getTemplateById(candidate);  | ||||
| 			if (t != null) { | ||||
| 				log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: FOUND TEMPLATE : [" | ||||
| 						+ candidate	+ "]"); | ||||
| 				Generated result = GeneratorFactory.createGenerator(t).generate(t, parameters); | ||||
| 				return result; | ||||
| 			} else { | ||||
| 				log.debug("GENERATING for factory [" + factory.getFactoryId() + "] :: NOT FOUND TEMPLATE : [" | ||||
| 						+ candidate	+ "]"); | ||||
| 			} | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| 	public TemplateService getTemplateService() { | ||||
| 		return templateService; | ||||
| 	} | ||||
|  | ||||
| 	public void setTemplateService(TemplateService templateService) { | ||||
| 		this.templateService = templateService; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,84 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.tracker; | ||||
|  | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| import org.osgi.framework.Bundle; | ||||
| import org.osgi.framework.ServiceRegistration; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
|  | ||||
| public class TrackedFactory { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(TrackedFactory.class); | ||||
| 	 | ||||
| 	public static Map<String, TrackedFactory> trackedFactoriesMap = new HashMap<>(); | ||||
| 	 | ||||
| 	private String id; | ||||
| 	private Bundle bundle;  | ||||
| 	private String configString; | ||||
| 	 | ||||
| 	private ServiceRegistration<EntaxyFactory> serviceRegistration; | ||||
| 	 | ||||
| 	public String getId() { | ||||
| 		return id; | ||||
| 	} | ||||
|  | ||||
| 	public void setId(String id) { | ||||
| 		this.id = id; | ||||
| 	} | ||||
|  | ||||
| 	public Bundle getBundle() { | ||||
| 		return bundle; | ||||
| 	} | ||||
|  | ||||
| 	public void setBundle(Bundle bundle) { | ||||
| 		this.bundle = bundle; | ||||
| 	} | ||||
|  | ||||
| 	public String getConfigString() { | ||||
| 		return configString; | ||||
| 	} | ||||
|  | ||||
| 	public void setConfigString(String configString) { | ||||
| 		this.configString = configString; | ||||
| 	} | ||||
|  | ||||
| 	public ServiceRegistration<EntaxyFactory> getServiceRegistration() { | ||||
| 		return serviceRegistration; | ||||
| 	} | ||||
|  | ||||
| 	public void setServiceRegistration(ServiceRegistration<EntaxyFactory> serviceRegistration) { | ||||
| 		this.serviceRegistration = serviceRegistration; | ||||
| 	} | ||||
| 	 | ||||
| 	public void unregister() { | ||||
| 		if (this.serviceRegistration != null) | ||||
| 			try { | ||||
| 				this.serviceRegistration.unregister(); | ||||
| 			} catch (Exception e) { | ||||
| 				log.warn("TrackedFactory [" + getId() + "]", e); | ||||
| 			} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,83 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.tracker; | ||||
|  | ||||
| import java.io.BufferedReader; | ||||
| import java.io.InputStreamReader; | ||||
| import java.net.URL; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Enumeration; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import org.osgi.framework.Bundle; | ||||
| import org.osgi.framework.BundleEvent; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import ru.entaxy.platform.base.support.osgi.tracker.UniformBundleTrackerCustomizer; | ||||
|  | ||||
| public class TrackedFactoryCustomizer extends UniformBundleTrackerCustomizer<List<TrackedFactory>> { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(TrackedFactoryCustomizer.class); | ||||
| 	 | ||||
| 	private static final String FACTORY_ROOT_PATH = "/ru/entaxy/factory/"; | ||||
| 	 | ||||
| 	@Override | ||||
| 	protected List<TrackedFactory> createManagedObject(Bundle bundle, BundleEvent event, | ||||
| 			Map<String, List<?>> filterResults) { | ||||
| 		 | ||||
| 		List<TrackedFactory> result = new ArrayList<>(); | ||||
| 		 | ||||
| 		Enumeration<URL> entries = bundle.findEntries(FACTORY_ROOT_PATH, "*.json", false); | ||||
| 		while (entries.hasMoreElements()) { | ||||
| 			URL entry = entries.nextElement(); | ||||
| 			String urlString = entry.toString(); | ||||
| 			log.debug("Found path: " + urlString); | ||||
| 			if (urlString.endsWith("/")) | ||||
| 				continue; | ||||
| 			String id = urlString.substring(urlString.lastIndexOf("/") + 1); | ||||
| 			id = id.substring(0, id.lastIndexOf(".")); | ||||
| 			log.debug("Found id: " + id); | ||||
| 			 | ||||
| 			try { | ||||
| 				String config = new BufferedReader ( | ||||
| 						  new InputStreamReader( | ||||
| 								  entry.openStream(), StandardCharsets.UTF_8)) | ||||
| 							.lines() | ||||
| 							.collect(Collectors.joining("\n")); | ||||
| 				TrackedFactory tf = new TrackedFactory(); | ||||
| 				tf.setId(id); | ||||
| 				tf.setBundle(bundle); | ||||
| 				tf.setConfigString(config); | ||||
| 				result.add(tf); | ||||
| 			} catch (Exception e) { | ||||
| 				log.error("Error reading url: " + urlString, e); | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,102 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.tracker; | ||||
|  | ||||
| import java.util.Dictionary; | ||||
| import java.util.Hashtable; | ||||
| import java.util.List; | ||||
|  | ||||
| import org.osgi.framework.BundleContext; | ||||
| import org.osgi.framework.ServiceRegistration; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import ru.entaxy.base.generator.template.TemplateService; | ||||
| import ru.entaxy.platform.base.objects.factory.EntaxyFactory; | ||||
| import ru.entaxy.platform.base.objects.factory.impl.DefaultFactory; | ||||
| import ru.entaxy.platform.base.support.CommonUtils; | ||||
| import ru.entaxy.platform.base.support.osgi.tracker.BundleTrackerCustomizerListener; | ||||
|  | ||||
| public class TrackedFactoryCustomizerListener implements BundleTrackerCustomizerListener<List<TrackedFactory>> { | ||||
| 	 | ||||
| 	private static final Logger log = LoggerFactory.getLogger(TrackedFactoryCustomizerListener.class); | ||||
| 	 | ||||
| 	protected BundleContext bundleContext; | ||||
| 	 | ||||
| 	public TrackedFactoryCustomizerListener(BundleContext bundleContext) { | ||||
| 		this.bundleContext = bundleContext; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void added(List<TrackedFactory> managedObject) { | ||||
| 		if (managedObject == null) { | ||||
| 			log.debug("managedObject is null"); | ||||
| 			return; | ||||
| 		} | ||||
| 		for (TrackedFactory tf: managedObject) { | ||||
| 			log.debug("Added factory: " + tf.getId()); | ||||
| 			if (TrackedFactory.trackedFactoriesMap.containsKey(tf.getId())) { | ||||
| 				TrackedFactory.trackedFactoriesMap.get(tf.getId()).unregister(); | ||||
| 			} | ||||
| 			DefaultFactory defaultFactory = new DefaultFactory(); | ||||
| 			defaultFactory.setFactoryId(tf.getId()); | ||||
| 			defaultFactory.configure(tf.getConfigString()); | ||||
| 			if (defaultFactory.isValid()) { | ||||
|  | ||||
| 				tf.setId(defaultFactory.getFactoryId()); | ||||
| 				 | ||||
| 				Dictionary<String, String> props = new Hashtable<String, String>(); | ||||
| 				props.put(EntaxyFactory.SERVICE.PROP_ID, defaultFactory.getFactoryId()); | ||||
| 				props.put(EntaxyFactory.SERVICE.PROP_TYPE, defaultFactory.getFactoryType()); | ||||
| 				props.put(EntaxyFactory.SERVICE.PROP_ORIGIN_BUNDLE, tf.getBundle().getBundleId()+"");				 | ||||
| 				 | ||||
| 				tf.setServiceRegistration( | ||||
| 						this.bundleContext.registerService(EntaxyFactory.class, defaultFactory, props) | ||||
| 				); | ||||
| 				 | ||||
| 				TrackedFactory.trackedFactoriesMap.put(tf.getId(), tf); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void modified(List<TrackedFactory> managedObject) { | ||||
| 		// TODO Auto-generated method stub | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void removed(List<TrackedFactory> managedObject) { | ||||
| 		if (managedObject == null) | ||||
| 			return; | ||||
| 		for (TrackedFactory tf: managedObject) { | ||||
| 			try { | ||||
| 				tf.getServiceRegistration().unregister(); | ||||
| 			} catch (Exception e) { | ||||
| 				// do nothing | ||||
| 			} | ||||
| 			TrackedFactory.trackedFactoriesMap.remove(tf.getId()); | ||||
| 		} | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,69 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * test-producers | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2022 EmDev LLC | ||||
|  * ========== | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  *  | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  *  | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.platform.base.objects.factory.tracker; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import org.osgi.framework.Bundle; | ||||
| import org.osgi.framework.BundleContext; | ||||
| import org.osgi.service.component.ComponentContext; | ||||
| import org.osgi.service.component.annotations.Activate; | ||||
| import org.osgi.service.component.annotations.Component; | ||||
| import org.osgi.service.component.annotations.Deactivate; | ||||
| import org.osgi.util.tracker.BundleTracker; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import ru.entaxy.platform.base.support.osgi.tracker.BundleTrackerUtils; | ||||
| import ru.entaxy.platform.base.support.osgi.tracker.filter.BundleHeaderFilter; | ||||
|  | ||||
| @Component(service = {TrackerManager.class}, immediate = true) | ||||
| public class TrackerManager { | ||||
|  | ||||
| 	private static final Logger log = LoggerFactory.getLogger(TrackerManager.class); | ||||
| 	 | ||||
| 	protected BundleContext bundleContext; | ||||
| 	 | ||||
| 	protected BundleTracker<List<TrackedFactory>> factoryTracker; | ||||
| 	 | ||||
| 	@Activate | ||||
| 	public void activate(ComponentContext componentContext) { | ||||
| 		this.bundleContext = componentContext.getBundleContext(); | ||||
| 		log.debug("Activated: " + bundleContext.getBundle().getBundleId()); | ||||
| 		 | ||||
| 		factoryTracker = BundleTrackerUtils.<List<TrackedFactory>>createBuilder() | ||||
| 				.addFilter( | ||||
| 					(new BundleHeaderFilter()).header("Entaxy-Factory-Provider")	 | ||||
| 				) | ||||
| 				.customizer( | ||||
| 					(new TrackedFactoryCustomizer()) | ||||
| 					.listener(new TrackedFactoryCustomizerListener(bundleContext)) | ||||
| 				) | ||||
| 				.bundleState(Bundle.ACTIVE | Bundle.INSTALLED | Bundle.RESOLVED) | ||||
| 				.get(); | ||||
| 		factoryTracker.open(); | ||||
| 		log.debug("Factory tracker started"); | ||||
| 	} | ||||
| 	 | ||||
| 	@Deactivate | ||||
| 	public void deactivate(ComponentContext componentContext) { | ||||
| 		factoryTracker.close(); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										201
									
								
								platform/runtime/base/objects-base/objects-core/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								platform/runtime/base/objects-base/objects-core/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user